2011-12-07 245 views
2

對於橢圓臺球桌,如何能碰撞被檢測和這個表和一個彈子球邊界之間解決?碰撞與橢圓

1)我想見如果位置彈子球的,P(X,Y),就在於

  • 內部
  • 橢圓的邊界。 [更新:部分1被解決]

2。)如果它位於的邊界處,新的速度必須計算(正好翻轉速度是不夠的)。

3.)如果它位於以外,它必須是移回先位於邊界上。

  ======== 
     ====  * ==== 
    ====    ==== 
    =      = 
    ====    ==== 
     ====  ==== 
      ======== 

鑑於是檯球的位置P(X,Y)和速度V(X,Y),加上橢圓C的中心(X_0,y_0)和兩半的位置軸的a,b的橢圓。

+0

儘管我喜歡解決這些問題,但您是否打算編寫解決方案? – Jacob

+0

另外,你只是想看看P(x,y)是否位於橢圓的邊界上? – Jacob

+0

我編輯了我的問題以包含更多細節。我已經做了一個圓圈,但我似乎無法找到橢圓的正確開始。 – Ben

回答

0

既然你正在考慮一個橢圓(因此凸)板,我想你可以使用基於GJK的東西。在碰撞期間,您將獲得接觸點和表面法線,並且在沒有碰撞的情況下,物體與相關見證點之間的最小距離。

使用GJK進行碰撞檢測的速度非常快,您可以非常輕鬆地將其應用於其他形狀(您只需要重新編碼support function)。對於一個橢圓,我認爲支持函數是這樣的(試圖驗證):

h =((x^2)/(a^4)+(y^2)/(b^4 ))^( - 1/2)

一些鏈接:

+0

謝謝,但我想找到我自己的解決方案(有一些幫助)。 – Ben

2

只需使用橢圓的方程一樣時使用的圓式:

((p.x-x0)/a)^2 + ((p.y-y0)/b)^2 = k 

若k < 1 - >橢圓內

若k == 1 - >上的橢圓

若k> 1 - >橢圓外

+0

不知道爲什麼我沒有看到,thx!現在不那麼令人愉快的部分:如果球在橢圓之外,則需要將其重新設置到橢圓邊界上​​的相應點(即球設法在兩幀之間逸出)。此外,我只注意到只是翻轉速度是不夠的。相反,我需要計算新的速度? – Ben

+1

您的意思是「如果k == 1 - >在橢圓上」? – Ryan

0

一些有趣的實驗與橢圓表。 Delphi代碼(沒有錯誤處理!)。

//calculates next ball position in ellipse 
//ellipse semiaxes A, B, A2 = A * A, B2 = B * B 
//center CX, CY 
//PX,PY - old position, VX,VY - velocity components 
//V - scalar velocity V = Sqrt(VX * Vx + VY * VY) 

procedure TForm1.Calc; 
var 
    t: Double; 
    eqA, eqB, eqC, DD: Double; 
    EX, EY, DX, DY, FX, FY: Double; 
begin 
    //new position 
    NPX := PX + VX; 
    NPY := PY + VY; 

    //if new position is outside 
    if (B2 * Sqr(NPX) + A2 * Sqr(NPY) >= A2 * B2) then begin 

    //find intersection point of the ray in parametric form and ellipse 
    eqA := B2 * VX * VX + A2 * VY * VY; 
    eqB := 2 * (B2 * PX * VX + A2 * PY * VY); 
    eqC := -A2 * B2 + B2 * PX * PX + A2 * PY * PY; 
    DD := eqB * eqB - 4 * eqA * eqC; 
    DD := Sqrt(DD); 

    //we need only one bigger root 
    t := 0.5 * (DD - eqB)/eqA; 

    //intersection point 
    EX := PX + t * VX; 
    EY := PY + t * VY; 

    //mark intersection position by little circle 
    Canvas.Ellipse(Round(EX - 2 + CX), Round(EY - 2 + CY), 
        Round(EX + 3 + CX), Round(EY + 3 + CY)); 

    //ellipse normal direction 
    DX := B2 * EX; 
    DY := A2 * EY; 
    DD := 1.0/(DY * DY + DX * DX); 

    //helper point, projection onto the normal 
    FX := DD * (NPX * DX * DX + EX * DY * DY - DY * DX * EY + DX * DY * NPY); 
    FY := DD * (-DX * DY * EX + DX * DX * EY + DX * NPX * DY + DY * DY * NPY); 

    //mirrored point 
    NPX := NPX + 2 * (EX - FX); 
    NPY := NPY + 2 * (EY - FY); 

    //new velocity components 
    DD := V/Hypot(NPX - EX, NPY - EY); 
    VX := (NPX - EX) * DD; 
    VY := (NPY - EY) * DD; 
    end; 

    //new position 
    PX := NPX; 
    PY := NPY; 

    //mark new position 
    Canvas.Ellipse(Round(PX - 1 + CX), Round(PY - 1 + CY), 
       Round(PX + 1 + CX), Round(PY + 1 + CY)); 

end; 

A = 125,B = 100 開始從橢圓中心(左圖)和從右側焦點(右圖),球到達左焦點,然後返回到正確的聚焦