Je cherche désespérément à faire un code permettant d'animer des points avec un déplacement aléatoire à l'intérieur d'un cercle. Mon souci vient du fait que je ne sais pas comme faire en sorte que les points rebondissent sur les contours du cercle et ainsi restent dedans.
J'ai essayé d'inverser leur vitesse quand leur distance au centre dépassait le rayon mais ça ne marche pas vraiment puisque certain points arrivent à s'échapper et d'autres se mette bizarrement à vibrer
Voilà le 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 !
Points qui bougent à l'intérieur d'un cercle
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.