主页 > 创业  > 

python:pymunk+pygame模拟六边形中小球弹跳运动

python:pymunk+pygame模拟六边形中小球弹跳运动

向 chat.deepseek 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动,小球初始位置在中心点,中心点位置不变。

以下是结合 pymunk(2D 物理引擎)和 pygame 的 Python 脚本,模拟六边形中小球的弹跳运动。

1. 安装依赖

确保你已经安装了 pymunk 和 pygame:pip install pymunk pygame

2. 示例代码 test_pymunk_6e1b.py  # -*- coding: utf-8 -*- """ pymunk + pygame 模拟六边形小球弹跳运动 """ import pygame import pymunk import pymunk.pygame_util import math # 初始化pygame pygame.init() # 屏幕参数 width, height = 800, 600 screen = pygame.display.set_mode((width, height)) pygame.display.set_caption("2D Hexagon Ball Simulation with Pymunk") # 初始化pymunk space = pymunk.Space() space.gravity = (0, 500) # 设置重力 # 绘制选项 draw_options = pymunk.pygame_util.DrawOptions(screen) # 创建六边形的静态物体 def create_hexagon(center, radius, rotation_angle=0): num_sides = 6 points = [] for i in range(num_sides): angle = 2 * math.pi * i / num_sides + rotation_angle x = center[0] + radius * math.cos(angle) y = center[1] + radius * math.sin(angle) points.append((x, y)) # 创建六边形的边 segments = [] for i in range(num_sides): p1 = points[i] p2 = points[(i + 1) % num_sides] segment = pymunk.Segment(space.static_body, p1, p2, 5) segment.elasticity = 0.8 # 反弹系数 segment.friction = 0.5 # 摩擦力 segments.append(segment) return segments # 创建小球 def create_ball(space, position, radius, mass): moment = pymunk.moment_for_circle(mass, 0, radius) body = pymunk.Body(mass, moment) body.position = position shape = pymunk.Circle(body, radius) shape.elasticity = 0.8 # 反弹系数 shape.friction = 0.5 # 摩擦力 space.add(body, shape) return body # 中心点和半径 hexagon_center = (width // 2, height // 2) hexagon_radius = 200 # 初始六边形 rotation_angle = 0 # 初始旋转角度 hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle) for segment in hexagon_segments: space.add(segment) # 创建小球 ball_radius = 20 ball_mass = 1 ball_position = (width // 2, height // 2 - hexagon_radius + ball_radius + 10) ball_body = create_ball(space, ball_position, ball_radius, ball_mass) # 主循环 clock = pygame.time.Clock() running = True rotation_speed = 0.01 # 旋转速度 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 清屏 screen.fill((255, 255, 255)) # 更新六边形的旋转角度 rotation_angle += rotation_speed if rotation_angle >= 2 * math.pi: rotation_angle -= 2 * math.pi # 移除旧的六边形边 for segment in hexagon_segments: space.remove(segment) # 创建新的六边形边 hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle) for segment in hexagon_segments: space.add(segment) # 更新物理引擎 space.step(1 / 60.0) # 绘制物理空间 space.debug_draw(draw_options) # 刷新屏幕 pygame.display.flip() clock.tick(60) pygame.quit() 3.运行 python test_pymunk_6e1b.py 

运行脚本后,你会看到一个六边形和一个红色小球在六边形内弹跳。小球受重力影响,碰到六边形的边时会反弹。

4. 代码说明

初始化:

初始化 pygame 和 pymunk。

设置重力方向为向下((0, 500))。

创建六边形:

使用 pymunk.Segment 创建六边形的六条边。

设置边的弹性(elasticity)和摩擦力(friction)。

创建小球:

使用 pymunk.Circle 创建一个圆形刚体。

设置小球的弹性(elasticity)和摩擦力(friction)。

主循环:

每帧更新物理引擎(space.step)。

使用 space.debug_draw 绘制物理空间的内容。

显示:

使用 pygame 显示六边形和小球的运动。

5. 自定义参数

你可以调整以下参数来改变模拟效果:

重力:修改 space.gravity 的值。

反弹系数:修改 elasticity 的值(范围为 0 到 1)。

摩擦力:修改 friction 的值。

小球质量:修改 ball_mass 的值。


6. 总结

使用 pymunk 可以轻松实现 2D 物理模拟。

结合 pygame 可以实现图形显示和交互。

这个脚本是一个简单的示例,你可以根据需要扩展功能,例如添加更多小球或更复杂的形状。

 

标签:

python:pymunk+pygame模拟六边形中小球弹跳运动由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“python:pymunk+pygame模拟六边形中小球弹跳运动