2011-12-08 65 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)。也就是從c減去p時得到的歸一化矢量。

現在我已將coeff作爲0(撞擊後沒有任何速度)和1(撞擊後相同速度)之間的因素。你可以通過確定一個正確的恢復係數來使這更加物理上合理。

最後,上面的所有公式都是簡單的reflection,例如您可能已經在基本的光線追蹤器中看到過。如上所述,這是一個來自精確物理模擬的相當粗略的抽象,但很可能會完成這項工作。

+0

我更新了我的問題,以顯示我的公式得出的結果。那裏似乎有錯誤? – Ben

+0

您的正常情況是錯誤的。我寫了normalize(c-p)。所以你的法線永遠不會有250的長度。你需要規範化它。 – Bart

+0

謝謝,你是對的,我忘了。所以現在它適用於我的第一個問題更新中提到的情況。但是,對於其他情況,速度會增加(請參閱第二次更新)。 – Ben

0

正如評論所說,這是一個力學問題。 看看momentum的定義。 你特別想要的是彈性碰撞