在Python中的每个帧中对多个Circle进行动画处理

时间:2019-04-09 05:25:14

标签: python-3.x matplotlib animation

我正在尝试使用Python在this video中创建动画。但是我坚持第一步。到目前为止,我已经创建了一个圆和一个围绕其圆周旋转的点。我的代码如下。现在,我想沿着x轴绘制与y相对应的x=np.arange(0, I*np.pi, 0.01)值(如代码中的update()函数所示)。为此,我必须定义另一个函数来绘制这些xy并将该函数传递到新的animation.FuncAnimation()中。

有什么方法可以仅使用update()函数来绘制所有内容吗?

注意,我在here中找到了该动画的代码。但这是用Java编写的!

我的代码

import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np


W = 6.5
H = 2
radius = 1
I = 2
T = 3
N = 2

plt.style.use(['ggplot', 'dark_background'])


def create_circle(x, y, r):
    circle = plt.Circle((x, y), radius=r, fill=False, alpha=0.7, color='w')
    return circle


def create_animation():

    fig = plt.figure()
    ax = plt.axes(xlim=(-2, W + 2), ylim=(-H, H))

    circle = create_circle(0, 0, radius)
    ax.add_patch(circle)

    line1, = ax.plot(0, 1, marker='o', markersize=3, color='pink', alpha=0.7)

    def update(theta):
        x = radius * np.cos(theta)
        y = radius * np.sin(theta)

        line1.set_data([0, x], [0, y])

        return line1,


    anim = []
    anim.append(animation.FuncAnimation(fig, update,
                                        frames=np.arange(0, I * np.pi, 0.01),
                                        interval=10, repeat=True))

    # anim.append(animation.FuncAnimation(fig, update_line, len(x),
    #                                     fargs=[x, y, line, line1], interval=10))

    plt.grid(False)
    plt.gca().set_aspect('equal')
    plt.gca().spines['left'].set_visible(False)
    plt.gca().spines['top'].set_visible(False)
    plt.gca().spines['right'].set_visible(False)
    plt.gca().spines['bottom'].set_visible(False)
    plt.gca().set_xticks([])
    plt.gca().set_yticks([])

    plt.show()


if __name__ == '__main__':

    create_animation()

编辑。我通过定义全局变量pos并按以下方式更改update()函数来改进了这项任务……动画现在看起来更好,但仍然有错误!

改良部分

    plot, = ax.plot([], [], color='w', alpha=0.7)
    level = np.arange(0, I * np.pi, 0.01)
    num = []
    frames = []
    for key, v in enumerate(level):
        num.append(key)
        frames.append(v)

    def update(theta):
        global pos
        x = radius * np.cos(theta)
        y = radius * np.sin(theta)
        wave.append(y)

        plot.set_data(np.flip(level[:pos] + T), wave[:pos])
        line1.set_data([0, x], [0, y])
        pos += 1

        return line1, plot,

编辑到目前为止,我已经完成了以下操作:

def update(theta):
    global pos
    x, y = 0, 0

    for i in range(N):
        prev_x = x
        prev_y = y

        n = 2 * i + 1
        rad = radius * (4 / (n * np.pi))
        x += rad * np.cos(n * theta)
        y += rad * np.sin(n * theta)
        wave.append(y)

        circle = create_circle(prev_x, prev_y, rad)
        ax.add_patch(circle)

        plot.set_data(np.flip(level[:pos] + T), wave[:pos])
        line2.set_data([x, T], [y, y])
        line1.set_data([prev_x, x], [prev_y, y])

        pos += 1

    return line1, plot, line2,

输出 enter image description here

请帮助更正此动画。或者,有没有有效的方法来制作此动画?

编辑好了,现在动画可以部分播放了。但是有一个小问题:在我的代码中(在update()的内部),我必须为每个帧添加以(prev_x, prev_y)为半径的圆,圆的半径定义为rad。因此,我尝试在for loop的定义中使用update(),但所有圆都保留在图中(请参见下面的输出)。但如上所述,我希望每帧具有中心和半径的一个圆。 plot也是同样的问题。我尝试在ax.clear()中使用for loop,但是没有用。

0 个答案:

没有答案