名称: 一个简单的交互式实时碰撞模拟演示程序 作者: 尹茂帆 Ted Yin <ted.sybil@gmail.com> 计算机类专业 发布许可: GNU General Public License v3 (见python源代码开头) Acknowledgement: 使用了Tkinter库,其余原创。 运行环境: Python VM, Tkinter 因为是实时模拟程序,建议用CPU效能较高的电脑运行。 介绍: 左侧为canvas。 右侧上方为选中球的实时物理参数,下方左侧Freeze/Play按钮可以暂停/继续物理模拟,右边Exit是退出按钮。 在canvas上用左键单击即可选中球,被选中的球用蓝色标识,并且在右边可看见其实时参数(可点Freeze暂停来看清参数)。 在选中小球之后,可以使用w, a, s, d来分别给小球上,左,下,右的加速度,观察效果。 demo.py只是一个演示,使用者可以结合自己需求来添加修改木板和小球,甚至对PhyUI进行二次封装。 文件结构: physics.py --- 一些基本的类的抽象和运动学计算 simulate.py --- 碰撞处理和与graphics的通信 graphics.py --- 用户界面和用户事件的响应 demo.py --- 演示程序 由上至下由最抽象到最具体。 对于函数和类的简单文档在代码中,可用__doc__得到。 思路和整体结构: physics.py: Vect2D 是一个向量类,重载了常用的向量运算符,并且有内外积的函数。 在之后的坐标表示中,任意点均用Vect2D的对象表示。 PhysicalSprite 是一个物理基类,定义了位移(shift),速度(velo),加速度(accel), 质量(mass)。 并且定义了一个move函数根据当前状态计算出经过dt事件的下个状态。 simulate.py: CanvasSprite 是一个显示基类, 提供了与Tk中canvas进行交互的接口,和一些必要的初始化。 Ball 是一个多重继承自PhysicalSprite和CanvasSprite的类,是小球的抽象。定义了对于小球有意义的基本信息,如radius等, 以及小球之间的碰撞检测方法。 Plank 也是一个多重继承自上述两个基类的子类,是木板的抽象。定义了木板的基本信息,如碰撞损耗(e)等, 以及小球和木板之间的碰撞检测方法。 graphics.py: PhyUI 是一个用于创建显示实体的类,主要负责与Tk直接进行交互,并且创建基本窗口布局。 里面提供了视口变换函数将物理意义上的坐标映射到屏幕坐标,这个映射关系详见demo.py中的设置(set_viewport)。 demo.py: 一个用于演示的样例,创建了若干小球和木板,参数均可修改。