2016-02-26 3 views
-1

Мне нужно анимировать точку/график, который перемещается случайным образом, пока он не пересечет круг, который затем остается включенным. В идеале, было бы несколько точек, которые, когда в конечном итоге на круге, были бы равномерно распределены по указанному кругу. Я видел коды, используя matplotlib и matplotlib.animate, которые анимировали график функции, но я не смог их полностью понять.Анимация движущейся точки

Спасибо за ваше время!

Edit: This is what it would look like with one dot

And with several dots

+2

Возможно, было бы полезно, если вы можете указать, что вы уже пробовали и/или что именно это, вы не понимаете. Тогда должно быть проще предоставить помощь. :) –

+0

Ну, например, здесь есть этот урок: https://jakevdp.github.io/blog/2012/08/18/matplotlib-animation-tutorial/ Когда автор оживляет несколько очков (третья анимация), где именно та часть, которая генерирует не одну, а 100 баллов? – user5987384

ответ

2

Я никогда не анимированный ничего в Python, так что я хоть что я могу узнать что-то новое, и написал следующий код, который одушевляет точку, поэтому она движется в случайном направления. Возможно, это поможет вам начать с вашей задачи. Код основан на matplotlib-animation-tutorial.

EDIT: У меня была длинная поездка на поезде, и я реализовал то, о чем вы просили. У вас есть куча случайных движущихся точек. Как только они попадают в синий круг, они пытаются максимизировать расстояние между ними, поэтому через некоторое время это выглядит так, как вы хотели.

""" 
Matplotlib Animation Example 

author: Jake Vanderplas 
email: [email protected] 
website: http://jakevdp.github.com 
license: BSD 
Please feel free to use and modify this, but keep the above information. Thanks! 
""" 
import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import math 

# 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): 
     def distance(x1, y1, x2, y2): 
      return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) 

     def inside(x1, y1): 
      if distance(x1, y1, 5, 5) <= 1: 
       return True 
      else: 
       return False 

     def calc_dist(d): 
      ret = 0 
      for x in dots: 
       if inside(x.x, x.y) and x != d:        
        ret = ret + distance(x.x, x.y, d.x, d.y) 
      return ret 

     # if dot is inside the circle it tries to maximize the distances to 
     # other dots inside circle 
     if inside(self.x, self.y): 
      dist = calc_dist(self) 
      for i in xrange(1, 10): 
       self.velx = self.generate_new_vel() 
       self.vely = self.generate_new_vel() 
       self.x = self.x + self.velx 
       self.y = self.y + self.vely 
       if calc_dist(self) <= dist or not inside(self.x, self.y): 
        self.x = self.x - self.velx 
        self.y = self.y - self.vely 
     else: 
      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 
      if self.x >= 10: 
       self.x = 10 
       self.velx = -1 * self.velx 
      if self.x <= 0: 
       self.x = 0 
       self.velx = -1 * self.velx 
      if self.y >= 10: 
       self.y = 10 
       self.vely = -1 * self.vely 
      if self.y <= 0: 
       self.y = 0 
       self.vely = -1 * self.vely 

# Initializing dots 
dots = [dot() for i in xrange(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') 
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. blit=True means only re-draw the parts that have changed. 
anim = animation.FuncAnimation(fig, animate, frames=200, interval=20) 

plt.show() 
+0

Большое спасибо. Осталось мало вопросов; вы могли бы еще объяснить это: dot.get_xdata() [0] + random.uniform (-0.05, 0.05) а также почему есть запятая после «точки»? Также, как я могу перейти от этого к нескольким движущимся точкам? – user5987384

+0

'random.uniform (-0.05, 0.05)' возвращает случайное число между '-0.05' и' 0.05', затем оно добавляется к параметру 'x' точки; 'dot,' является кортежем '(dot,)'; Я думаю, вы можете добавить больше точек, добавив параметры 'x, y' в списки' ax.plot ([5], [5], 'ro') ', но я еще не уверен, возможно, я буду работать еще по этому коду позже. –

+0

@ user5987384 Я отредактировал ответ. Теперь у вас много движущихся точек, и они останутся в синем круге, как вы хотели. –

Смежные вопросы