2011-11-23 148 views
1

我已經知道矩形的矩形碰撞檢測,但是這次我有2個旋轉的位圖。 我的意思是,我有正常的位圖+一個名爲「方向」的浮動變量,並告訴位圖在繪製時必須旋轉到哪個方向。Android - 位圖碰撞檢測(旋轉)

但是如何才能知道如果這些對象的2互相碰撞?這將是足夠多的,也一樣,如果你可以說我2之間的碰撞檢測是如何旋轉矩形作品...或者,也許你可以張貼一些代碼...

謝謝你,如果你能幫助(謝謝你,如果你花時間閱讀這還是想着答案)

回答

1

一般情況下,你會needto使用Separating Axis Theorem確定兩個旋轉矩形是否發生碰撞。但是有一種簡單的方法,您可以在使用SAT之前判斷矩形是否發生碰撞,以便您不必進行不必要的處理。您可以執行邊界圓檢查,通過證明矩形不相交,證明它們的邊界圓不相交。

一個矩形的外接圓共享其中心,並有一個直徑等於或者對角線的矩形的的長度。基本上,如果圓不相交,那麼矩形也不能相交。

我不知道你是如何執行你的旋轉,但如果你使用的是形狀/地區類型的對象,你可以使用AffineTransform進行旋轉,然後用intersects()每個旋轉對象的區域,以檢查他們是否碰撞,這可以節省你自己實施它。請看下面的例子:

import java.awt.Rectangle; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Area; 

public class Main { 

    public static void main(String args[]) { 
     //Create rectangle 
     Rectangle rect = new Rectangle(10, 10, 10, 10); 
     //Create transformation object 
     AffineTransform af = new AffineTransform(); 
     //Rotate the rectangle by 45 degrees 
     af.rotate(Math.PI/4, rect.x, rect.y); 

     Rectangle rect2 = new Rectangle(20, 20, 20, 20); 
     AffineTransform bf = new AffineTransform(); 
     bf.rotate(Math.PI/4, rect2.x, rect2.y); 

     //Create Area objects based off of the Rectangle objects 
     Area areaA = new Area(rect); 
     //Set the Area object to be the same as the Rectangle object 
     areaA = areaA.createTransformedArea(af); 
     Area areaB = new Area(rect2); 
     areaB = areaB.createTransformedArea(bf); 

     //Check if the objects collide by using their Area equivalent 
     if (areaA.intersects(areaB.getBounds())) { 
      System.out.println("Collision!"); 
     } 
    } 
} 

可以很明顯的,修改這個適合你的實現 - 我希望這點你在正確的方向。

+0

非常感謝您對這個答案,但unfortunatels我無法導入這些套件... :(它總是說:「進口的java.awt.geom不能得到解決」,並,每進口。也許是因爲我編碼爲Android? – user1059863

+0

http://google.com/codesearch/p?hl=en#uX1GffpyOZk/awt/java/awt/geom/AffineTransform.java顯示,AWT包是可用到Android(據我所知),你會但是必須將Rectangle更改爲Rectangle2D – Deco

+0

java.awt中唯一對我可用的包是java.awt.font ...這可能是因爲我正在爲2.1開發,並且它不受支持嗎? – user1059863