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
Merci beaucoup pour votre aide !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()
-----