You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多中心点的2D平面绕圆运动点动画?

解决多中心点圆周运动动画问题

你的问题出在只创建了单个点对象,且原计算逻辑没适配多中心的数组运算,导致无法让每个点绕对应中心运动。下面是修改后的完整代码,直接就能运行:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 4,3
from matplotlib.animation import FuncAnimation

# 多中心点的x、y坐标,改成numpy数组方便向量化运算
b = np.array([0, 10])  # x坐标
a = np.array([1, 11])  # y坐标
cen_x = b
cen_y = a

fig, ax = plt.subplots()
# 调整坐标轴范围,确保所有运动的点都能显示
ax.axis([np.min(cen_x) - 5, np.max(cen_x) + 5, np.min(cen_y) - 5, np.max(cen_y) + 5])
ax.set_aspect("equal")

# 创建多个点对象,每个中心点对应一个运动的点
points = []
for x0, y0 in zip(cen_x, cen_y):
    # 初始位置设为圆周上的起始点(phi=0时的位置)
    point, = ax.plot(x0 + 2*np.cos(0), y0 + 2*np.sin(0), marker="o")
    points.append(point)

r = 2  # 圆周半径

def circle(phi):
    # 利用numpy向量化运算,一次性计算所有中心点对应的圆周坐标
    x = cen_x + r * np.cos(phi)
    y = cen_y + r * np.sin(phi)
    return x, y

def update(phi):
    # 获取当前角度下所有点的坐标
    x_coords, y_coords = circle(phi)
    # 逐个更新每个点的位置
    for point, x, y in zip(points, x_coords, y_coords):
        point.set_data(x, y)
    # 返回所有点对象用于blitting优化
    return points

ani = FuncAnimation(fig, update, interval=1, blit=True, repeat=True,
                    frames=np.linspace(0, 2*np.pi, 360, endpoint=False))
plt.show()

关键改动说明:

  • 多对象维护:用列表points存储每个运动点的对象,不再是单个point,确保每个中心对应一个独立的运动点。
  • 向量化计算:把中心点坐标改成numpy数组,circle函数利用numpy的广播机制,一次性算出所有点在当前角度的坐标,避免循环嵌套。
  • 初始位置修正:原代码初始位置直接用中心点,现在改成圆周的起始位置,动画更连贯。
  • 坐标轴范围优化:缩小了偏移量(从10改成5),让画面更紧凑,也可以根据需求调整。
  • update返回值:返回所有点对象,适配blitting动画的更新逻辑。

内容的提问来源于stack exchange,提问作者Mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:53:42