猫史档案馆


【Python作品分享】双摆【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

运用了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


回复

上一页1 页 / 共 1下一页
飞熊jSrt飞熊jSrt

沙发捏

点赞0


评论


飞熊jSrt飞熊jSrt

嗨嗨嗨,板凳

点赞0


评论


飞熊jSrt飞熊jSrt

还是我,天花板

点赞0


评论


活泼的小电鼠S0fF活泼的小电鼠S0fF

【作品介绍】中mat是什么东东????????????

 

点赞0


评论