2013-02-12 166 views
2

我正在開發一個Java遊戲(但開發語言並不重要),包括諸如球或小圓球等圓形對象,現在正在處理碰撞。 我使用一個計時器,所以在每一幀我檢查是否碰撞發生。碰撞檢測:圓角對象

下面是一個表示對象右上角的圖。

enter image description here

的對象的中心由點[0,0]來表示,它的半徑是10px的,單位是像素。

現在,如果我的對象(例如,obj_1)是正方形/菱形(藍線),找到,如果另一個(obj_2)碰撞它,我只是要得到他們的座標,並通過檢查Math.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radius我會知道,如果有碰撞。

但是,這個問題對於圓形(紅線)來說更加棘手,因爲它需要更多的空間,而且這個佔用的空間並沒有被直線限制。當然,我將必須舍入一些值(例如在上圖中,如果我想檢查x = 2處的碰撞,我將不得不圍繞看起來像9.5到10的y值)。但我根本不知道如何得到這個公式。任何幫助將非常感激。

回答

2

正如您所提到的,實現語言並不重要,我會爲您提供檢測圓形對象碰撞的通用解決方案。

另外,從我收集的情況來看,場景中的所有對象都是圓圈。下面的解決方案不適用於檢測圓和其他形狀之間的碰撞。

假設你有兩個圓圈c1c2。假設相應的半徑是c1.rc2.r,並且中心是(c1.x,c1.y)(c2.x,c2.y),然後將下面的函數將告訴C1和C2是否在碰撞

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = sqrt((x1-x2)^2 +(y1-y2)^2); //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r) < center_distance) 
      return false; 
    else 
      return true; 

} 

這個僞代碼函數將返回如果圓圈碰撞,否則爲false。

基本上,函數做的是檢查圓心的距離是否大於它們各自的半徑之和。

+1

完美,很好,完美解決了它。非常感謝! – Rob 2013-02-12 20:06:12

2

在Java中,您有一個java.awt.Polygon

Polygon類有多個包含方法和相交方法。

將圓定義爲Polygon是一種痛苦,具體取決於您希望圓的準確程度。但是,一旦將所有對象定義爲Polygon s,就可以使用定義的方法來檢測碰撞。

1

您可以在邊框中設置圓角形狀。這會產生較不準確的碰撞,但是與其他方法相比具有巨大的性能優勢

1

的除了@ ANKIT的解決方案:

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = (x1-x2)^2 +(y1-y2)^2; //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r)^2 < center_distance) 
     return false; 
    else 
     return true; 
} 

這只是比較平方距離。結果是一樣的,但沒有平方根和巨大的性能收益。