Я пытался написать анимацию, используя FuncAnimation, которая позволила бы центрировать красную звезду вокруг четырех желтых звезд. (Меня интересует что-то более сложное, но я подумал, что если я смогу решить эту проблему с игрушкой, то смогу подойти к настоящему.) В любом случае, я заставил это работать, но я не понимаю почему. В частности, на что ссылаются (в функциях initial_frame
и animation_frame)
на stars[0]
и bigstar[0]
? Я полагаю, что и звезды, и большие звезды являются графиками 2D-линий. Я не видел такой техники использования FuncAnimation раньше ( хотя я относительно новичок в Python) и подумал, что это может быть интересно. Спасибо!
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots(figsize = (8, 8))
ax.set_xlim(-100, 100)
ax.set_ylim(-100, 100)
ax.set_facecolor('k')
R = 40.
theta = 0.
x_data = np.zeros(4) # x, y data for yellow stars
y_data = np.zeros(4)
X_data = np.zeros(1) # X, Y data for red star
Y_data = np.zeros(1)plots
(stars, bigstar) = (ax.plot(x_data, y_data, 'oy', ls = ' ', ms = 8),\
ax.plot(X_data, Y_data, 'or', ls = ' ', ms = 40))
def initial_frame():
global theta
theta = np.arange(4)*np.pi / 2.
x_data = R * np.cos(theta)
y_data = R * np.sin(theta)
stars[0].set_xdata(x_data)
stars[0].set_ydata(y_data)
return (stars, bigstar)
def animation_frame(frame_number):
global theta
a = 0. # setting a to be nonzero allows the red star to move
theta = theta + np.pi/200.
x_data = R * np.cos(theta)
y_data = R * np.sin(theta)
global X_data, Y_data
X_data = X_data + a
Y_data = Y_data + a
stars[0].set_xdata(x_data)
stars[0].set_ydata(y_data)
bigstar[0].set_xdata(X_data)
bigstar[0].set_ydata(Y_data)
return (stars, bigstar)
animation = FuncAnimation(fig, func = animation_frame,
init_func = initial_frame, interval = 10)
plt.show()