2016-02-13 148 views
0

我想告訴兩個rectangles是否碰撞。我沒有問題,如果矩形不旋轉,但我在我的邏輯有一些問題,當他們都旋轉。這裏是我的方法,我目前正在使用:兩個旋轉矩形之間的java碰撞檢測

public static void car_on_ai_collision(AI ai, Entity e){ 

     //rotation of each rectangle in radians 
     double ai_rot = ai.getAIEntity().getRotation().y; 
     double car_rot = e.getRotation().y; 

     //stores the center point of the rectangles 
     Vector3f ai_loc = ai.getAIEntity().getLocation(); 
     Vector3f car_loc = e.getLocation(); 

     //here i am lining the square for my car up to a axis by making it have no rotation 
     ai_rot -= car_rot; 
     car_rot = 0; 

     //creating rectangles with the size of the car 
     Rectangle car = new Rectangle(175, 70); 
     Rectangle ai_rec = new Rectangle(175, 70); 


     car.translate((int) ((int) car_loc.x-87.5), (int) car_loc.z-35); 

     //rotation for rectangle 
     AffineTransform aiAT = new AffineTransform(); 
     aiAT.translate((int) ai_loc.x - 87.5, (int) ai_loc.z-35); 
     aiAT.rotate(Math.toDegrees(ai_rot), ai_loc.x, ai_loc.z); 

     Area a = new Area(ai_rec); 
     a.transform(aiAT); 

     //testing for collision 
     if(a.getBounds2D().intersects(car)){ 
      System.out.println("Collision!"); 
     } 
    } 

碰撞檢測似乎並沒有在任何地方接近是正確的,從我的理解軸的一個需要對齊。我試圖對齊一個軸,然後測試與AffineTransform的碰撞,但我在網上看到有關旋轉超過90度的事情會導致一個問題。我如何解決這個問題來測試兩個旋轉矩形之間的碰撞?任何幫助表示讚賞。

+1

你的意思是這樣[這](http://stackoverflow.com/questions/20927189/detecting-collision-of-two-sprites-that-c​​an-rotate/20928531#20928531) – MadProgrammer

+0

謝謝,一些修修補補後,我能夠使用像你的例子一樣的路徑找出它。我用upvote打你,不像你需要它:)。謝謝。 – Ryan

+0

很高興它可以幫助;) – MadProgrammer

回答

2

碰撞檢測只有兩例很簡單:對準的矩形之間圈

  • 之間

SmashCode解釋如何檢測圓之間的衝突。 對齊的矩形更容易,只需要比較矩形的最大和最小座標重疊。

可悲的是,你的情況並非如此。這些矩形具有不同的座標系,並且由於它們的旋轉,其中一個矩形的邊緣可能與第二個的軸線垂直或平行,因此不能像這樣處理。

其中一個方法就是像你這樣在這裏使用邊界框:

if(a.getBounds2D().intersects(car)){ 
    System.out.println("Collision!"); 
} 

調用a.getBounds2D()創建一個對準座標系統,涵蓋整個形狀矩形。但是包圍盒也會覆蓋一些沒有被形狀佔據的空間。因此,檢查對齊矩形和旋轉一個的邊界框之間的碰撞是快速和容易的,但可能會產生誤報像顯示在 drawing of rectangles and bounding box of rotated one.

要全面,準確地檢查碰撞,你需要使用一些更復雜的方法,如SAT使用將多邊形投射(投影)到不同的軸上。事實證明,你只用矩形工作意味着你只需要兩個座標軸,並且你已經知道他們的方向。

PS。使用邊界框沒有錯誤,它是檢查兩個數字是否不發生碰撞的簡單方法(如果邊界框不碰撞數字不會發生碰撞),仍然可以使用它作爲更快的預檢以消除明顯的情況。

1
I will tell the logic instead of code here follow these works. 

讓您正在旋轉樞軸是(X1,Y1)和第二矩形樞軸爲(X2,Y2)

1.創建與正在旋轉的樞軸和langth矩形的圓半徑(讓半徑爲R1)

2.Do同樣爲第二矩形(半徑爲R2)

3.mark d爲2圈的中心之間的距離。使用距離爲2點公式a = Math.pow((x2-x1),2)b =((y2-y1),2)distance = Math.sqrt(a + b)

4.calculate r1 + R2

5.如果R1 + R2> =距離然後兩個矩形相交於一點

6.Else他們因此未相交

蔭提供鏈路這裏link在它們交叉THRE存在根據1個或2點條件1 if(r1 + r2)=距離和2 if(r1 + r2)>距離