用户:
林中鸟22查看:2 回复:4 评论:2 创建时间:2024-01-29T19:07:02
【作品展示】

【作品介绍】
运用了pygame和mat,为确保速度变化与时间的关系更加符合物理规律,使用leEuler-Cromer法
【作品源代码】
import pygame
import math
# 初始化pygame
pygame.init()
# 设置窗口大小和标题
window_size = (800, 600)
screen = pygame.display.set_mode(window_size)
pygame.display.set_caption("双摆动画")
# 定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# 定义双摆参数
L1 = 200 # 第一根杆长
L2 = 200 # 第二根杆长
M1 = 40 # 第一质点质量
M2 = 40 # 第二质点质量
G = 9.8 # 重力加速度
# 初始角度和角速度
theta1 = math.pi / 2
theta2 = math.pi / 4
omega1 = 0
omega2 = 0
# 计算角加速度
def compute_accelerations(theta1, theta2, omega1, omega2):
delta_theta = theta2 - theta1
common_term = (M1 + M2) * L1 - M2 * L1 * \
math.cos(delta_theta) * math.cos(delta_theta)
alpha1 = (M2 * L1 * omega1 * omega1 * math.sin(delta_theta) * math.cos(delta_theta) +
M2 * G * math.sin(theta2) * math.cos(delta_theta) +
M2 * L2 * omega2 * omega2 * math.sin(delta_theta) -
(M1 + M2) * G * math.sin(theta1)) / common_term
alpha2 = (-M2 * L2 * omega2 * omega2 * math.sin(delta_theta) * math.cos(delta_theta) +
(M1 + M2) * G * math.sin(theta1) * math.cos(delta_theta) -
(M1 + M2) * L1 * omega1 * omega1 * math.sin(delta_theta) -
(M1 + M2) * G * math.sin(theta2)) / common_term
return alpha1, alpha2
# 更新摆的状态
def update_pendulum(state, dt):
theta1, theta2, omega1, omega2 = state
alpha1, alpha2 = compute_accelerations(theta1, theta2, omega1, omega2)
omega1 += alpha1 * dt
omega2 += alpha2 * dt
theta1 += omega1 * dt
theta2 += omega2 * dt
return theta1, theta2, omega1, omega2
# 转换坐标系
def cartesian_coordinates(theta1, theta2):
x1 = L1 * math.sin(theta1)
y1 = L1 * math.cos(theta1)
x2 = x1 + L2 * math.sin(theta2)
y2 = y1 + L2 * math.cos(theta2)
return x1, y1, x2, y2
# 游戏主循环
clock = pygame.time.Clock()
running = True
while running:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 清空屏幕
screen.fill(BLACK)
# 更新摆的状态
dt = 0.01
theta1, theta2, omega1, omega2 = update_pendulum(
(theta1, theta2, omega1, omega2), dt)
# 转换坐标系
x1, y1, x2, y2 = cartesian_coordinates(theta1, theta2)
# 绘制摆的轨迹
pygame.draw.line(screen, WHITE, (window_size[0] // 2, L1),
(int(window_size[0] // 2 + x1), int(y1 + L1)), 2)
pygame.draw.line(screen, WHITE, (int(window_size[0] // 2 + x1), int(
y1 + L1)), (int(window_size[0] // 2 + x2), int(y2 + L1)), 2)
pygame.draw.circle(
screen, WHITE, (int(window_size[0] // 2 + x1), int(y1 + L1)), 10)
pygame.draw.circle(
screen, WHITE, (int(window_size[0] // 2 + x2), int(y2 + L1)), 10)
# 更新屏幕显示
pygame.display.flip()
# 控制帧率
clock.tick(360)
# 退出程序
pygame.quit()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn