Android - 位图碰撞检测(旋转)

时间:2011-11-23 20:30:09

标签: java android rotation collision

我已经知道矩形碰撞检测与矩形,但这次我有2个旋转的位图。 我的意思是,我有正常的位图+一个名为“方向”的浮点变量,并告诉位图必须在绘图时旋转到哪个方向。

但我怎么知道其中2个物体是否互相撞击?如果你能告诉我2个旋转矩形之间的碰撞检测是如何工作的话,那也是很有意思的......或许你可以发布一些代码......

如果你能提供帮助,谢谢你(感谢你花时间阅读或思考答案)

1 个答案:

答案 0 :(得分:1)

通常,您需要使用Separating Axis Theorem来确定两个旋转的矩形是否发生碰撞。但是有一种简单的方法可以在使用SAT之前判断矩形是否发生碰撞,这样您就不必进行不必要的处理。您可以进行边界圆检查,通过证明它们的边界圆不相交来证明矩形不相交。

矩形的边界圆共享其中心,其直径等于矩形的任一对角线的长度。基本上,如果圆不相交,则矩形也不能相交。

我不确定你是如何进行旋转的,但是如果你使用的是Shape / Area类型的对象,你可以使用AffineTransform来执行旋转,然后在Area of​​ Area上使用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!");
        }
    }
}

显然,你可以修改它以适应你的实现 - 我希望这能指明你正确的方向。