Ich versuche eine Funktion zu schreiben, die Punkte erzeugt, die sich in einem Kreis bewegen. Ich habe bereits eine Funktion, die animierte Punkte mit Matpltolib-Animation plottet (danke an Tony Babarino), aber ich habe Probleme, das Teil zu schreiben, das die Punkte zwingt, im Kreis zu bleibenWie können animierte Punkte in einem Kreis dargestellt werden?
So funktioniert das Teil, das die Bewegung generiert
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
# Initializing number of dots
N = 25
# Creating dot class
class dot(object):
def __init__(self):
self.x = 10 * np.random.random_sample()
self.y = 10 * np.random.random_sample()
self.velx = self.generate_new_vel()
self.vely = self.generate_new_vel()
def generate_new_vel(self):
return (np.random.random_sample() - 0.5)/5
def move(self) :
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
# Initializing dots
dots = [dot() for i in range(N)]
# First set up the figure, the axis, and the plot element we want to animate
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), 1, color='b', fill=False)
ax.add_artist(circle)
# animation function. This is called sequentially
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,
# call the animator.
anim = animation.FuncAnimation(fig, animate, frames=200, interval=20)
plt.show()
ich möchte die Funktion bewegen verbessern, indem ein Teil hinzufügen, der die Punkte zwingen, im Kreis saty ich die Grenzen des Kreises wollen wie ein Zaun zu sein, dass die Punkte nicht überschreiten können
Ich weiß, wie man erkennt, wenn ein Punkt c wirft die Linie, aber ich weiß nicht, was ich danach machen soll.
Vielen Dank für Ihre Hilfe
Sie müssen klären, was Sie passieren soll, wenn ein Punkt die Grenze des Kreises trifft: nicht prallen sie zurück? Bleib hier? Wieder auf der anderen Seite erscheinen? In jedem Fall ist die zentrale Idee, dass Sie die Kreisbedingung erzwingen müssen: 'x ** 2 + y ** 2
Cyb3rFly3r
Der Punkt soll zurückprallen – Jkev
Dann könnten Sie einfach das Zeichen von invertieren die Geschwindigkeit (beide Komponenten). Da Ihr Kreis seinen Mittelpunkt nicht im Ursprung hat, ist die Gleichung in diesem Fall etwas anders: '(x - xc) ** 2 + (y - yc) ** 2
Cyb3rFly3r