箭頭旋轉+正弦波

redufa發表於2024-11-10

image


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, FancyArrowPatch
from matplotlib.animation import FuncAnimation

# 建立一個新圖和兩個座標軸
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))

# 設定座標軸的等比例,確保圓圈是正圓
ax1.set_aspect('equal')
ax2.set_aspect('auto')

# 限制座標軸的範圍
ax1.set_xlim(-1.5, 1.5)
ax1.set_ylim(-1.5, 1.5)
ax2.set_xlim(0, 2 * np.pi)
ax2.set_ylim(-1.5, 1.5)

# 設定座標軸標籤
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')
ax2.set_xlabel('Angle (radians)')
ax2.set_ylabel('Amplitude')

# 設定標題
ax1.set_title('Rotating Arrow')
ax2.set_title('Sine Wave')

# 繪製一個圓圈
circle = Circle((0, 0), 1, color='blue', fill=False)
ax1.add_patch(circle)

# 初始化箭頭的引數
arrow = FancyArrowPatch((0, 0), (1, 0), color='red', mutation_scale=20, arrowstyle='->', lw=3)
ax1.add_patch(arrow)

# 初始化正弦波的線
x_data, y_data = [], []
line, = ax2.plot(x_data, y_data, 'r-', label='sin(ωt)')

# 新增圖例
ax2.legend()

# 初始化角度
angle = 0

# 更新函式,用於動畫
def update(frame):
    global angle, x_data, y_data
    angle += 0.05  # 每次旋轉0.05弧度
    if angle > 2 * np.pi:  # 如果角度超過2π,則重置角度
        angle = 0
        x_data, y_data = [], []  # 重置資料
    # 更新箭頭的位置
    arrow.set_positions((0, 0), (np.cos(angle), np.sin(angle)))
    # 更新正弦波的資料
    x_data.append(angle)
    y_data.append(np.sin(angle))
    line.set_data(x_data, y_data)
    return arrow, line,

# 建立動畫
ani = FuncAnimation(fig, update, frames=np.arange(0, 360), interval=50, blit=True, repeat=True)

# 顯示圖形
plt.show()

相關文章