我看过 Peter Colling Ridge 的精彩教程
http://www.petercollingridge.co.uk/pygame-physical-simulation/
我正在扩展 PyParticles 脚本
该代码可以在网站上获得(免费),我正在使用 PyParticles4.py
教程中使用的类
粒子类
具有半径、质量、速度、位置的圆形二维物体
春季班
绑定 2 个对象(粒子)并使用胡克定律(F = -kx) 以确定它们之间的相互作用
环境类
粒子相互作用的环境
我想知道是否可以使用 2 个粒子并创建一个具有特定长度的“Rod”类(如教程中的 Spring 类),并且不允许粒子靠近超过该(指定)长度。
Also,
对每个粒子施加一个力(需要时),这样如果一个粒子被拉向左侧,另一个粒子也会被拉向左侧,但实际上......
就像使用钢棒将两种不同类型的球(从中心)连接起来一样,但是在二维中......
And I 不想使用第三方模块
提前致谢..
编辑/更新:
尝试应用约束定理(失败)
这是代码:
class Rod:
def __init__(self, p1, p2, length=50):
self.p1 = p1
self.p2 = p2
self.length = length
def update(self):
'Updates The Rod and Particles'
# Temp store of co-ords of Particles involved
x1 = self.p1.x
x2 = self.p2.x
###### Same for Y #######
y1 = self.p1.y
y2 = self.p2.y
# Calculation of d1,d2,d3 and final values (x2,y2)
# from currently known values(x1,y1)...
# From Constraint algorithm(see @HristoIliev's comment)
dx1 = x2 - x1
dy1 = y2 - y1
# the d1, d2, d3
d1 = math.hypot(dx1,dy1)
d2 = abs(d1)
d3 = (d2-self.length)/d2
x1 = x1 + 0.5*d1*d3
x2 = x2 - 0.5*d1*d3
y1 = y1 + 0.5*d1*d3
y2 = y1 - 0.5*d1*d3
# Reassign next positions
self.p1.x = x1
self.p2.x = x2
###### Same for Y #######
self.p1.y = y1
self.p2.y = y2
二维杆有 3 个自由度(2 个速度/位置 + 1 个旋转/角频率)。
我将表示以通常的方式受力修改的中心位置,并使用旋转(为简单起见,围绕系统中心)变量计算粒子的位置。
旋转由力改变
ang_accel = F * r * sin (angle(F,r)) / (2*M * r^2)
Where
ang_accel
是角加速度
F
是作用在特定球上的力,因此有 2torques* 相加是因为有两个力相加(矢量方式)以更新中心的位置。
r
是长度的一半
angle(F,r)
是力矢量和半径矢量之间的角度(从中心到受到力的粒子),
So that
F * r * sin (angle(F,r))
is the torque关于中心,以及
2*M * r^2
is the 惯性矩围绕中心的两点系统。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)