Java Android-位图冲突检测(旋转)

Java Android-位图冲突检测(旋转),java,android,rotation,collision,Java,Android,Rotation,Collision,我已经知道矩形与矩形的碰撞检测,但这次我有两个旋转位图。 我的意思是,我有普通位图+一个称为“方向”的浮点变量,告诉位图在绘图时必须旋转的方向 但是,我如何确定其中两个对象是否相互碰撞?如果你能告诉我两个旋转矩形之间的碰撞检测是如何工作的,那也太好了。。。或者你可以发布一些代码 如果您能提供帮助,谢谢您(如果您花时间阅读本文或思考答案,也谢谢您)通常,您需要使用来确定两个旋转的矩形是否碰撞。但是有一种简单的方法,可以在使用SAT之前判断矩形是否发生碰撞,这样就不必进行不必要的处理。可以进行边界圆

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

但是,我如何确定其中两个对象是否相互碰撞?如果你能告诉我两个旋转矩形之间的碰撞检测是如何工作的,那也太好了。。。或者你可以发布一些代码


如果您能提供帮助,谢谢您(如果您花时间阅读本文或思考答案,也谢谢您)

通常,您需要使用来确定两个旋转的矩形是否碰撞。但是有一种简单的方法,可以在使用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!");
        }
    }
}

很明显,您可以修改它以适应您的实现-我希望这将为您指明正确的方向。

通常,您需要使用来确定两个旋转的矩形是否碰撞。但是有一种简单的方法,可以在使用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!");
        }
    }
}

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

非常感谢您的回答,但不幸的是,我无法导入这些包中的任何一个…:(它总是说“导入java.awt.geom无法解析”,而且每次导入都是这样。可能是因为我在为android编码?表明awt包可用于android(afaik),但您必须将矩形更改为矩形2D。在java.awt中,我唯一可以使用的包是java.awt.font…这可能是因为我正在为2.1开发,但它在那里不受支持吗?!非常感谢您的回答,但不幸的是,我无法导入这些包中的任何一个…:(它总是说:“导入java.awt.geom无法解析”,并且每次导入都无法解析。可能是因为我在为android编写代码?显示awt包可用于android(afaik),但您必须将矩形更改为矩形2D。在java.awt中,我唯一可以使用的包是java.awt.font…这可能是因为我正在为2.1开发,但它在那里不受支持?!?