[Python] Animer des points à l'intérieur d'un cercle
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

[Python] Animer des points à l'intérieur d'un cercle



  1. #1
    invitefee2e751

    [Python] Animer des points à l'intérieur d'un cercle


    ------

    Bonsoir

    Je cherche à écrire un code qui pourrait permettre d'animer des points dans un cercle. Je voudrais que les points aient un mouvement aléatoire dans le cercle et surtout qu'ils y restent enfermés.
    J'ai fait tout ça avec matplotlib simulation sauf que je n'arrive pas à faire en sorte que les points ne s'échappent pas du cercle.

    J'ai essayé de mettre la condition suivante (x,y coordonnées du pt, xc,yc coordonnées du centre du cercle) : si (x-xc)^2 + (y-yc)^2 > R^2 alors j'inverse la vitesse du point sauf que ça ne marche pas vraiment. Je ne sais pas pourquoi mais parfois les points se mettent à vibrer ou finissent carrément par sortir du cercle

    Code:
    import numpy as np
    from matplotlib import pyplot as plt
    from matplotlib import animation
    
    # Initialisation nbre de points
    N = 10
    
    
    # Creation classe d'objet points
    class dot(object):
        def __init__(self): #initialisation position et vitesse
            self.x = np.random.random_sample() +5
            self.y = np.random.random_sample() +5
            self.velx = self.generate_new_vel()
            self.vely = self.generate_new_vel()
    
        def generate_new_vel(self): #generateur de vitesse aléatoire
            return (np.random.random_sample() - 0.5) / 8
    
        def move(self) :
                if ((self.x-5)**2 + (self.y-5)**2)>=(2)**2 : #c'est censé être le truc qui permet l'enfermement avec inversion des vitesses
                    self.velx=self.velx*(-1)
                    self.vely=self.vely*(-1)
            
                 #et ça c'est pour le déplacement aléatoire
                if np.random.random_sample() < 0.95:
                    self.x = self.x + self.velx
                    self.y = self.y + self.vely
                else:
                    self.velx = self.generate_new_vel()
                    self.vely = self.generate_new_vel()
                    self.x = self.x + self.velx
                    self.y = self.y + self.vely
                    
    
    
    # Initialisation points
    dots = [dot() for i in range(N)]
    
    # Initialisation figure et axes
    fig = plt.figure()
    ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
    d, = ax.plot([dot.x for dot in dots],
                 [dot.y for dot in dots], 'ro', markersize=3)
    circle = plt.Circle((5, 5), 2, color='b', fill=False)
    ax.add_artist(circle)
    
    
    # animation des points
    def animate(i):
        for dot in dots:
            dot.move()
        d.set_data([dot.x for dot in dots],
                   [dot.y for dot in dots])
        return d,
    
    anim = animation.FuncAnimation(fig, animate, frames=200, interval=20)
    
    plt.show()
    Merci beaucoup pour votre aide !

    -----

  2. #2
    minushabens

    Re : [Python] Animer des points à l'intérieur d'un cercle

    En changeant la vitesse en son opposé dès que tu touches le cercle, tu contrains le point à rester sur une corde. Si tu veux que le point se balade un peu partout dans le disque il vaut mieux le faire rebondir sur le cercle. Or le rebond sur le cercle ne se traduit pas par l'inversion de la vitesse. Il faut prendre le symétrique par rapport au rayon.

  3. #3
    invitefee2e751

    Re : [Python] Animer des points à l'intérieur d'un cercle

    Effectivement c'est cet effet de rebond que je recherche. Je ne comprends pas trop l'idée du symétrique par rapport au rayon. Pourrais-je avoir plus de précisions ?

  4. #4
    minushabens

    Re : [Python] Animer des points à l'intérieur d'un cercle

    La particule touche le cercle en un certain point M, avec une vitesse V. La vitesse après rebond doit être le symétrique de V par rapport au rayon OM (si O est le centre du cercle). Tu décomposes V en Vr et Vt (Vr = composante sur OM, Vt = composante sur la tangente au cercle, orthogonale au rayon). Pour trouver Vr et Vt il faut résoudre un système linéaire. Ensuite si W est la vitesse après rebond, tu as Wr= - Vr et Wt=Vt (W n'est pas l'opposé de V)

  5. A voir en vidéo sur Futura
  6. #5
    invitefee2e751

    Re : [Python] Animer des points à l'intérieur d'un cercle

    Ok, je vais essayer de mettre ça en place. Merci !

  7. #6
    polo974

    Re : [Python] Animer des points à l'intérieur d'un cercle

    autre chose: ne change pas la vitesse si elle est déjà orientée vers le centre (voir signe du produit scalaire rayon*vitesse)... sinon, ton point va rester dehors...
    Jusqu'ici tout va bien...

Discussions similaires

  1. Déplacement de points sur Python
    Par invitefee2e751 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/02/2016, 14h52
  2. Cercle sur une sphère (python)
    Par invitec2fc95c7 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 25/03/2015, 19h29
  3. 3 points d'un cercle -> centre
    Par invite7baf9949 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 30/01/2008, 14h48
  4. les points du cercle circonscrit
    Par invite975d9f0f dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 28/02/2007, 12h37
  5. Regression de points par un cercle
    Par invite282b2d93 dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 12/11/2004, 19h08