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

Matplotlib极坐标图中能否以已有摆端点为原点绘制双摆的第二个点?

双摆Matplotlib极坐标绘图解决方案

完全可以仅用θ₁、θ₂、L₁、L₂实现双摆的极坐标绘图,核心是解决第二个摆点的全局极坐标转换问题(Matplotlib极坐标图的原点固定,无法直接以第一个摆点为原点绘制局部极坐标),以下是具体实现步骤和代码:

关键坐标转换逻辑

  1. 角度适配:Matplotlib极坐标默认θ=0指向右侧(x轴正方向),逆时针为正;而你的θ定义是0指向竖直向下,逆时针为正。两者的转换关系为:

    θ_mpl = 3 * np.pi / 2 - θ_user
    

    (验证:θ_user=0(向下)→ θ_mpl=3π/2(Matplotlib极坐标的向下方向),完全匹配)

  2. 第二个摆点的全局极坐标计算:

    • 先将第一个摆点的极坐标转换为全局笛卡尔坐标(以悬挂点为原点,Matplotlib默认y轴向上):
      x1 = -L1 * np.sin(θ1)
      y1 = -L1 * np.cos(θ1)
      
    • 计算第二个摆点相对于第一个摆点的局部笛卡尔坐标(遵循相同的θ定义规则):
      x2_rel = -L2 * np.sin(θ2)
      y2_rel = -L2 * np.cos(θ2)
      
    • 叠加得到第二个摆点的全局笛卡尔坐标,再转换为Matplotlib极坐标:
      x2 = x1 + x2_rel
      y2 = y1 + y2_rel
      r2 = np.sqrt(x2**2 + y2**2)
      θ2_mpl = np.arctan2(y2, x2)
      

完整可运行代码

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

# 替换为你自己的双摆角度数据和摆长
L1 = 1.0
L2 = 1.0
t = np.linspace(0, 10, 200)
θ1 = np.sin(t)  # 示例θ1时间序列
θ2 = np.sin(2*t)  # 示例θ2时间序列

# 预计算所有帧的极坐标参数
θ1_mpl = 3 * np.pi / 2 - θ1
r1 = L1

x1 = -L1 * np.sin(θ1)
y1 = -L1 * np.cos(θ1)
x2 = x1 - L2 * np.sin(θ2)
y2 = y1 - L2 * np.cos(θ2)
r2 = np.sqrt(x2**2 + y2**2)
θ2_mpl = np.arctan2(y2, x2)

# 初始化极坐标图
fig = plt.figure()
ax = plt.subplot(111, polar=True)
ax.set_ylim(0, L1 + L2)  # 极径范围覆盖双摆最大长度
ax.set_theta_zero_location('E')  # 确认θ=0指向右侧
ax.set_theta_direction('counterclockwise')  # 逆时针为正

# 初始化绘图元素
line1, = ax.plot([], [], 'b-', linewidth=2)  # 第一根摆杆
line2, = ax.plot([], [], 'r-', linewidth=2)  # 第二根摆杆
ball1, = ax.plot([], [], 'bo', markersize=8)  # 第一个摆球
ball2, = ax.plot([], [], 'ro', markersize=8)  # 第二个摆球

def init():
    line1.set_data([], [])
    line2.set_data([], [])
    ball1.set_data([], [])
    ball2.set_data([], [])
    return line1, line2, ball1, ball2

def update(frame):
    # 更新第一根摆杆:从原点到第一个摆点
    line1.set_data([0, θ1_mpl[frame]], [0, r1])
    # 更新第二根摆杆:从第一个摆点到第二个摆点
    line2.set_data([θ1_mpl[frame], θ2_mpl[frame]], [r1, r2[frame]])
    # 更新摆球位置
    ball1.set_data(θ1_mpl[frame], r1)
    ball2.set_data(θ2_mpl[frame], r2[frame])
    return line1, line2, ball1, ball2

# 生成动画
ani = FuncAnimation(fig, update, frames=len(t), init_func=init, interval=50, blit=True)
plt.show()

说明

  • 所有运算都是基础的三角函数和代数运算,没有复杂的物理公式,完全基于你提供的θ₁、θ₂、L₁、L₂参数。
  • 代码中的角度序列是示例数据,你可以直接替换为自己模拟得到的θ₁、θ₂时间序列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:28:12