当前位置: 首页 > news >正文

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

向 chat.deepseek.com 提问:编写 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 math
import pygame
import pymunk
import pymunk.pygame_util# 初始化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 = 6points = []for i in range(num_sides):angle = 2 * math.pi * i / num_sides + rotation_anglex = 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 = positionshape = 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_speedif 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. 代码说明

  1. 初始化

    • 初始化 pygame 和 pymunk

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

  2. 创建六边形

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

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

  3. 创建小球

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

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

  4. 主循环

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

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

  5. 显示

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

5. 自定义参数

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

  • 重力:修改 space.gravity 的值。

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

  • 摩擦力:修改 friction 的值。

  • 小球质量:修改 ball_mass 的值。


6. 总结

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

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

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

 


pymunk + pygame 模拟八边形小球弹跳运动
只需修改一行 num_sides = 8 ,另存为:test_pymunk_8e1b.py
运行 python test_pymunk_8e1b.py

相关文章:

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

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

Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(二)

GPU 和 CPU 之间的同步 CPU 必须执行 MonitoredValue 的更新,并读取 CurrentValue,以确保不会丢失正在进行的信号中断通知。 当向系统中添加新的 CPU 等待程序时,或者如果现有的 CPU 等待程序失效时,OS 必须修改受监视的值。OS …...

23种设计模式之《模板方法模式(Template Method)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式&#xff0…...

DEV-C++ 为什么不能调试?(正确解决方案)

为了备战pat考试&#xff0c;专门下载了DEV C&#xff0c;然后懵圈的发现&#xff0c;怎么无法调试(╯□&#xff09;╯︵ ┻━┻ 然后整了半天&#xff0c;终于在网上找到相应的解决方案&#xff01;&#xff01;&#xff01;-> Dev C 5.11 调试初始设置 <- 一共四步…...

【C++设计模式】第五篇:原型模式(Prototype)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 克隆对象的效率革命 1. 模式定义与用途​ ​ 核心思想​ ​原型模式&#xff1a;通过复制现有对象​&#xff08;原型&#xff09;来创建新对象&#xff0c;而非通过new构造。​关键用…...

深入 Vue.js 组件开发:从基础到实践

深入 Vue.js 组件开发&#xff1a;从基础到实践 Vue.js 作为一款卓越的前端框架&#xff0c;其组件化开发模式为构建高效、可维护的用户界面提供了强大支持。在这篇博客中&#xff0c;我们将深入探讨 Vue.js 组件开发的各个方面&#xff0c;从基础概念到高级技巧&#xff0c;助…...

maven导入spring框架

在eclipse导入maven项目&#xff0c; 在pom.xml文件中加入以下内容 junit junit 3.8.1 test org.springframework spring-core ${org.springframework.version} org.springframework spring-beans ${org.springframework.version} org.springframework spring-context ${org.s…...

数据守护者:备份文件的重要性与自动化实践策略

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业运营和个人生活中不可或缺的核心资源。无论是企业的财务报表、客户资料&#xff0c;还是个人的家庭照片、工作文档&#xff0c;这些数据都承载着巨大的价值。然而&#xff0c;数据丢失的风险无处不在&#xff0c;硬件故障…...

MyBatis @Param 注解详解:指定的参数找不到?

MyBatis Param 注解详解 1. Param 注解的作用 Param 注解用于显式指定方法参数的名称&#xff0c;让 MyBatis 在 SQL 映射文件&#xff08;XML&#xff09;或注解中通过该名称访问参数。 核心场景&#xff1a; 方法有多个参数时&#xff0c;避免参数名丢失或混淆。参数为简单…...

【项目日记(八)】内存回收与联调

前言 我们前面实现了三层缓存申请的过程&#xff0c;并完成了三层缓存申请过程的联调&#xff01;本期我们来介绍三层的缓存的回收机制以及三层整体联调释放的过程。 目录 前言 一、thread cache 回收内存 二、central cache 回收内存 • 如何确定一个对象对应的span • …...

性能测试监控工具jmeter+grafana

1、什么是性能测试监控体系&#xff1f; 为什么要有监控体系&#xff1f; 原因&#xff1a; 1、项目-日益复杂&#xff08;内部除了代码外&#xff0c;还有中间件&#xff0c;数据库&#xff09; 2、一个系统&#xff0c;背后可能有多个软/硬件组合支撑&#xff0c;影响性能的因…...

016.3月夏令营:数理类

016.3月夏令营&#xff1a;数理类&#xff1a; 中国人民大学统计学院&#xff1a; http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮&#xff1a; http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…...

CS144 Lab Checkpoint 0: networking warm up

Set up GNU/Linux on your computer 我用的是Ubuntu&#xff0c;按照指导书上写的输入如下命令安装所需的软件包&#xff1a; sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…...

靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连

靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵&#xff0c;这里只有两个端口&#xff0c;感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...

给没有登录认证的web应用添加登录认证(openresty lua实现)

这阵子不是deepseek火么&#xff1f;我也折腾了下本地部署&#xff0c;ollama、vllm、llama.cpp都弄了下&#xff0c;webui也用了几个&#xff0c;发现nextjs-ollama-llm-ui小巧方便&#xff0c;挺适合个人使用的。如果放在网上供多人使用的话&#xff0c;得接入登录认证才好&a…...

3月5日作业

代码作业&#xff1a; #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在&#xff0c;请选择操作&#xff1a; 1) 清空目录内容 2) 保留目…...

【MySQL】增删改查

目录 一、新增&#xff08;Create&#xff09; 单行数据 全列插入 多行数据 指定列插入 插入时间 二、查询&#xff08;Retrieve&#xff09; 全列查询 指定列查询 查询字段为表达式 别名 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY 条件查询&#xff1…...

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…...

线反转法实现矩形键盘按键识别

由于行、列线为多键共用&#xff0c;各按键彼此将相互发 生影响&#xff0c;必须将行、列线信号配合起来并作适当的处 理&#xff0c;才能确定闭合键的位置。 线反转法 第1步&#xff1a;列线输出为全低电平&#xff0c;则行线中电平由高变低 的所在行为按键所在行。 第2步&…...

在 Element Plus 的 <el-select> 组件中,如果需要将 <el-option> 的默认值设置为 null。 用于枚举传值

文章目录 引言轻松实现 `<el-option>` 的默认值为 `null`I 实现方式监听清空事件 【推荐】使用 v-model 绑定 null添加一个值为 null 的选项处理 null 值的显示引言 背景:接口签名规则要求空串参与,空对象不参与签名计算 // 空字符串“” 参与签名组串,null不参与签…...

抖音批量下载神器:轻松保存无水印视频的终极指南 [特殊字符]

抖音批量下载神器&#xff1a;轻松保存无水印视频的终极指南 &#x1f3ac; 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallb…...

Linux屏幕取词翻译终极指南:CuteTranslation让你的跨语言阅读变得简单高效

Linux屏幕取词翻译终极指南&#xff1a;CuteTranslation让你的跨语言阅读变得简单高效 【免费下载链接】CuteTranslation Linux屏幕取词翻译软件 项目地址: https://gitcode.com/gh_mirrors/cu/CuteTranslation 你是否经常在Linux系统上阅读外文资料时遇到语言障碍&…...

1951-2025年中国1km月平均气温逐年年内季节波动幅度数据集

中国1000米分辨率月平均气温数据集&#xff08;1951-2025&#xff09;提供了长时间序列、规则网格的气象背景信息&#xff0c;为开展气候变化分析和区域比较研究提供了基础数据支撑。针对原始月尺度序列直接使用不够便捷的问题&#xff0c;需要进一步形成具有明确主题和统一格式…...

MPC-BE:Windows平台终极开源多媒体播放器架构深度解析与实战指南

MPC-BE&#xff1a;Windows平台终极开源多媒体播放器架构深度解析与实战指南 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной системы Windows. 项…...

从零到一:手把手教你用Cornerstone.js搭建一个基础的医学影像查看器

从零到一&#xff1a;手把手教你用Cornerstone.js搭建一个基础的医学影像查看器 医学影像的数字化呈现一直是医疗技术发展的重要方向。随着Web技术的进步&#xff0c;直接在浏览器中查看和操作DICOM等专业医学影像已成为可能。本文将带领前端开发新手一步步实现一个基础的医学影…...

告别复杂设置!Sunshine v0.21.0 + Moonlight安卓版:5分钟搞定家庭局域网游戏串流

5分钟极简指南&#xff1a;用Sunshine和Moonlight打造家庭游戏串流系统 客厅的沙发上&#xff0c;手机屏幕突然变成了你的高性能游戏PC——这不是科幻电影&#xff0c;而是每个家庭都能实现的游戏串流体验。过去需要复杂网络知识才能搭建的串流系统&#xff0c;如今借助Sunshin…...

MFAPC实战:如何为你的Arduino或树莓派项目添加智能自适应预测控制?

MFAPC实战&#xff1a;为嵌入式项目打造轻量级智能控制引擎 在创客空间和物联网实验室里&#xff0c;我们常看到这样的场景&#xff1a;一位开发者盯着反复震荡的智能小车摇头叹气&#xff0c;或是面对总也调不准的温室控制系统抓耳挠腮。传统PID控制在这些复杂动态系统中往往…...

从手机充电到电路板:一文搞懂Type-C的6P、16P、24P到底该怎么选(附实物图对比)

Type-C接口选型实战指南&#xff1a;6P/16P/24P的工程决策逻辑 当你在设计一款智能手表时&#xff0c;是否曾纠结过该用6P还是16P的Type-C接口&#xff1f;这个问题看似简单&#xff0c;却直接影响着产品的BOM成本、用户体验和市场竞争力。作为硬件开发者&#xff0c;我们每天都…...

Windows热键冲突终结者:Hotkey Detective深度解析与实战指南

Windows热键冲突终结者&#xff1a;Hotkey Detective深度解析与实战指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 想…...

Windows Cleaner技术架构深度解析:基于Python+PyQt5的智能系统优化工具实战指南

Windows Cleaner技术架构深度解析&#xff1a;基于PythonPyQt5的智能系统优化工具实战指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款…...