2011-12-08 13 views
4

円形のビリヤードテーブルでは、ビリヤードボールがある速度v1でそのテーブルの境界に衝突します。円の衝突後の新しい速度

double s = sqrt((p.x-a)*(p.x-a) + (p.y-b)*(p.y-b)); 
if (s<r)  // point lies inside circle 
        // do nothing 
else if (s==r) // point lies on circle 
        // calculate new velocity 
else if (s>r) // point lies outside circle 
        // move point back onto circle (I already have that part) 
        // calculate new velocity 

を今衝突後新しい速度V2は、反射(弾性衝突)の入射角=の角度こと、計算することが方法を次のように、この衝突が検出されましたか?

PS:ビリヤードボールは、速度ベクトルv(x、y)を有する点p(x、y)によって表される。シミュレーションはのないです。

+3

この質問はC++固有のようではありません。実際、それはプログラミング問題よりも数学的質問のように思えます。 –

+0

初速はどこですか?どのようにそれを表現していますか? –

+0

「v_new = coeff *(v_old - 2 * dot(v_old、boundary_normal)* boundary_normal);」のようなものは真剣に単純化された物理については? – Bart

答えて

3

:ここ

v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal); 

v_oldは、あなたの現在の速度ベクトルとboundary_normalがあなたの円形ビリヤードテーブルの内側に向いて正常ですインパクトの時点で円テーブルのcセンターを知っていて、影響ポイントがpの場合、法線は単にnormalize(c-p)です。つまり、pcから引いたときに得られる正規化ベクトルです。

私はcoeffを0(衝撃後には全く速度がありません)と1(衝撃後に同じ速度)の間のファッジファクターとみなしました。正しい反発係数を決定することによって、これをより物理的にもっともらしくすることができます。

上記のすべての式は、たとえば基本的なレイトレーサで見たように単純なreflectionです。前述のように、それは正確な物理シミュレーションからかなり粗雑な抽象ですが、仕事をする可能性が最も高いでしょう。

+0

あなたの数式で得た結果を表示するために質問を更新しました。そこに間違いがあるようですね? – Ben

+0

あなたの正常は間違っています。私はnormalize(c-p)を書きました。だから、あなたの普通は250の長さを持つことはできません。それを正規化する必要があります。 – Bart

+0

ありがとうございます、あなたは正しいです、私はそれを忘れました。だから今は私の最初の質問に記載されたケースで動作します。しかし、他の場合には、速度が増加する(2回目の更新を参照)。 – Ben

0

コメントによると、これは機械の質問です。 momentumの定義を見てください。 特にお望みのものは、弾性衝突の欄に記載されています。あなたはいくつかの簡単な(ゲームのような)ビリヤードにシミュレーションを作っているあなたのようなものを使用したと仮定すると

関連する問題