Determinant / simple_balls

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

名称:

    一个简单的交互式实时碰撞模拟演示程序

作者:

    尹茂帆 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:
		一个用于演示的样例,创建了若干小球和木板,参数均可修改。
		
	

About


Languages

Language:Python 100.0%