Анимация нескольких кругов на орбите - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь смоделировать орбиту двух тел. Я сгенерировал их траектории, которые хранятся в 4 списках (2 для параметризованной плоскости xy и 2 набора для каждого круга). Я пытаюсь создать 2 круга, которые вращаются вокруг друг друга. Я заставил программу работать, но есть ли способ, которым я могу обобщить свой код для большего количества кругов и сделать его менее громоздким, т.е. уменьшить повторение?

Вот мой код:

fig = plt.figure()
ax = plt.axes()
ax = plt.axes(xlim=(-12*10**6, 12*10**6), ylim=(-12*10**6, 12*10**6))

patch1 = plt.Circle((p1[0],p2[0]),1*10**6,color="b", animated=True)
patch2 = plt.Circle((m1[0],m2[0]),1*10**6,color="orange", animated=True)
def init():
    patch1.center = (p1[0], p2[0])
    ax.add_patch(patch1)
    patch2.center = (m1[0],m2[0])
    ax.add_patch(patch2)
    return patch1,patch2,

def animate(i):
    x, y = patch1.center
    x = p1[i]
    y = p2[i]
    patch1.center = (x, y)
    z, a = patch2.center
    z = m1[i]
    a = m2[i]
    patch2.center = (z, a)
    return patch1,patch2,

numframes = len(p1)
anim = FuncAnimation(fig, animate, init_func=init, frames = numframes, interval=0.0005,blit=True)

plt.show()

1 Ответ

1 голос
/ 05 марта 2020

Используя списки для разных кругов, вы можете использовать логи c проще:

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

# Generate sample data
angle = np.linspace(0, 2*np.pi, 100)
xy1 = np.array([np.cos(angle) * 2,
                np.sin(angle) * 1]).T
xy2 = np.array([np.cos(angle) * 1,
                np.sin(angle) * 2]).T

# Initialize all lists
xy_list = [xy1, xy2]
size_list = [1e-01, 1e-01]
color_list = ['blue', 'orange']
patch_list = [plt.Circle(xy=(xy[0]), radius=r, color=c, animated=True)
              for xy, r, c in zip(xy_list, size_list, color_list)]

# Create figure
fig = plt.figure()
ax = plt.axes(xlim=(-3, 3), ylim=(-3, 3))

# Add text
h_text = ax.text(0.9, 0.9, 'Time: {}'.format(0),
                 ha='center', va='center', transform=ax.transAxes)

def init():
    for p in patch_list:
        ax.add_patch(p)
    return patch_list + [h_text]

def animate(i):
    h_text.set_text('Time: {}'.format(i))
    for p, xy in zip(patch_list, xy_list):
        p.set_center(xy[i])
    return patch_list + [h_text]

numframes = len(xy_list[0])
anim = FuncAnimation(fig, animate, init_func=init,
                     frames=numframes, interval=5e-4, blit=True)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...