2016-04-23 7 views
1

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

+0

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

+0

Der Punkt soll zurückprallen – Jkev

+0

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

Antwort

0

ich den Code geändert, so dass Sie nicht die Probleme des vibarting und Flucht aus dem Kreis haben würden. Jeder Punkt, der in den Kreis eindringt, entweicht nicht (die Punkte können beim Start außerhalb des Kreises liegen) und vibriert nicht am Rand des Kreises. Import numpy als np von matplotlib Import pyplot als plt von matplotlib Import Animation

# Initializing number of dots 
N = 25 
XC = 5 
YC = 5 
R = 1 
R_SQR = R **2 

# Creating dot class 
class dot(object): 
    def __init__(self, ind): 
     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() 
     self.in_circle = not self.calc_out_of_circle() 

    def generate_new_vel(self): 
     return (np.random.random_sample() - 0.5)/5 

    def move(self) : 
     if np.random.random_sample() < 0.95: 
      self.check_out_of_circle() 
      self.x += self.velx 
      self.y += self.vely 
     else: 
      self.velx = self.generate_new_vel() 
      self.vely = self.generate_new_vel() 
      self.check_out_of_circle() 
      self.x += self.velx 
      self.y += self.vely 
     self.check_inside_circle() 

    def calc_out_of_circle_with_params(self, x, y): 
     return (x - XC) ** 2 + (y - YC) ** 2 >= R_SQR ** 2 

    def calc_out_of_circle(self): 
     return self.calc_out_of_circle_with_params(self.x, self.y) 

    def check_out_of_circle(self): 
     if self.in_circle and self.calc_out_of_circle_with_params(self.x + self.velx, self.y + self.vely): 
      self.velx = -self.velx 
      self.vely = -self.vely 

    def check_inside_circle(self): 
     if not self.calc_out_of_circle(): 
      self.in_circle = True 


# Initializing dots 
dots = [dot(i) 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((XC, YC), R, 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.axis('equal') 
plt.show()