7

Peter Colling Ridgeによるすばらしいチュートリアルを
http://www.petercollingridge.co.uk/pygame-physics-simulation/
で見ましたが、PyParticlesスクリプトを拡張しています
。コードはサイト(無料)で入手できます。 PyParticles4.pyを使用する

チュートリアルで使用されるクラス


半径、質量、速度、位置を持つ粒子クラス円形2dオブジェクト
ばねクラス
2つのオブジェクト(粒子)をバインドし、フックの法則 (F = -kx)を使用してそれら
の間の相互作用を決定するばね環境クラス
環境粒子は相互作用します

2つのパーティクルを使用して、特定の長さを持ち、パーティクルをその(指定された)長さよりも遠くに近づけない「ロッド」クラス(チュートリアルのSpringクラスのような)を作成できるかどうか疑問に思いました。
また、
各パーティクルに(必要に応じて)力を加えて、一方を左に引っ張るともう一方も引っ張られるようにしますが、現実的には..
鋼を使用して2つの異なるタイプのボールを(中央から)結合した場合と同じです。ロッド、しかし2次元で..
そして私はサードパーティのモジュールを使いたくない

前もって感謝します..

編集/更新:
制約定理を適用しようとしました(失敗しました)
コードは次のとおりです:

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
4

1 に答える 1

3

2Dのロッドには、3つの自由度があります(2つの速度/位置+1つの回転/角周波数)。
通常の方法で力によって変更される中心の位置を表し、回転(簡単にするためにシステムの中心の周り)変数を使用して粒子の位置を計算します。
回転は次の力によって変更されます

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

どこ

ang_accel角加速度です

Fは特定のボールに作用する力であるため、2つのトルク*があり、中心の位置を更新するために2つの力が(ベクトル単位で)加算されるため、加算されます。

r長さの半分は
angle(F,r)、力のベクトルと半径のベクトルの間の角度です(中心から力を受ける粒子まで)。

これが中心の周り
F * r * sin (angle(F,r))トルク
2*M * r^2であり、中心の周りの2点のシステムの慣性モーメントです。

于 2013-01-31T01:05:27.850 に答える