Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python球物理模拟_Python_Pygame_Physics - Fatal编程技术网

python球物理模拟

python球物理模拟,python,pygame,physics,Python,Pygame,Physics,我在 我正在扩展PyParticles脚本 该代码在网站上提供(免费),我使用的是PyParticles4.py 教程中使用的类 粒子类 具有半径、质量、速度和位置的圆形2d对象 春季课程 绑定两个对象(粒子)并使用(F=-kx)确定它们之间相互作用的弹簧 环境类 粒子相互作用的环境 我想知道是否可以使用2个粒子创建一个具有特定长度的“杆”类(如教程中的“弹簧”类),并且不允许粒子靠近或超过该(指定)长度。 同时, 对每个粒子施加一个力(必要时),这样,如果一个粒子向左拉,另一个粒子也会向左拉

我在

我正在扩展PyParticles脚本
该代码在网站上提供(免费),我使用的是PyParticles4.py

教程中使用的类 粒子类
具有半径、质量、速度和位置的圆形2d对象
春季课程
绑定两个对象(粒子)并使用(F=-kx)确定它们之间相互作用的弹簧
环境类
粒子相互作用的环境

我想知道是否可以使用2个粒子创建一个具有特定长度的“杆”类(如教程中的“弹簧”类),并且不允许粒子靠近或超过该(指定)长度。
同时,
对每个粒子施加一个力(必要时),这样,如果一个粒子向左拉,另一个粒子也会向左拉,但实际情况下……
非常类似于使用钢棒(从中心)连接两种不同类型的球,但采用2-d…
我不想使用第三方模块

提前谢谢

编辑/更新:
尝试应用约束定理(失败)
代码如下:

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

2D中的杆有3个自由度(2个速度/位置+1个旋转/角频率)。
我将以通常的方式表示受力修改的中心位置,并使用旋转(为简单起见,关于系统中心)变量计算粒子的位置。
旋转通过以下力进行修改:

ang_accel = F * r * sin (angle(F,r)) / (2*M * r^2)
在哪里

ang_accel
是角加速度

F
是作用在特定球上的力,因此有2*个力相加,因为有两个力相加(矢量方向),以更新中心位置

r
是长度的一半
角度(F,r)
是力向量和半径向量(从中心到受力粒子)之间的角度

因此
F*r*sin(角度(F,r))
是关于中心的
2*M*r^2
是围绕中心两个点的系统的最大值。

为什么不使用一个非常强大的弹簧呢?不,这些对象只是一直随机移动,它们的行为不符合我希望的方式,Python会引发一个错误“OverflowError:Python int太大,无法转换为C long”硬关节(如杆)是完整约束。这些通常通过特殊方法或将其建模为无限刚度弹簧,并明确找到必须应用于无约束系统的修正形式(参见示例)。@HristoIliev什么是x1,x2?你能解释一下最后两个方程式吗?我知道我必须将它们应用于x和y分量。@HristoIliev不,我尝试了一个测试代码,但它不起作用。使用约束算法,它没有真实地模拟,碰撞使粒子行为异常。。。它是python实现的,是否有输入错误<代码>ang_accel和
dang_accel
?是,输入错误。正如我所说,我会这样做,而不是基于粒子。你有3个自由度,这种方法对于消除2个自由粒子系统的四个自由度中的一个是最自然的。粒子的质量不一样。你可以通过改变转动惯量来调整角加速度公式,以考虑质量变化。@m.brindley Thx,以寻求帮助。