繁体   English   中英

两个旋转的矩形之间的java碰撞检测

[英]java collision detection between two rotated rectangles

我试图告诉两个rectangles是否正在碰撞。 如果矩形不旋转,我没有问题,但是当它们都旋转时,逻辑上有些问题。 这是我目前正在使用的方法:

    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度的问题。 如何解决此问题,以测试两个旋转的矩形之间的碰撞? 任何帮助表示赞赏。

冲突检测仅在两种情况下很简单:

  • 圈子之间
  • 对齐矩形之间

SmashCode解释了如何检测圆之间的碰撞。 对齐的矩形甚至更容易,您只需要比较矩形的最大和最小坐标是否重叠。

不幸的是,您的情况并非以上所述。 这些矩形具有不同的坐标系,并且由于它们的旋转,一个小角度的边缘可能垂直于或不平行于另一个矩形的轴线,因此不能像这样对待它们。

一种方法是像在此一样使用边界框:

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

调用a.getBounds2D()会创建一个矩形,该矩形与坐标系对齐并覆盖整个形状。 但是边界框也将覆盖一些未被形状占用的空间。 因此,检查对齐的矩形和旋转的框的边界框之间的碰撞是快速简便的,但可能会产生误报,如矩形和旋转的框的边界框所示

为了完全准确地检查碰撞,您需要使用一些更复杂的方法,例如SAT ,该方法使用将多边形投射(投影)到不同的轴上。 实际上,您仅使用矩形,这意味着您仅需要两个轴并且您已经知道它们的方向。

PS。 使用边界框并没有错,这是检查两个图形是否不冲突的简便方法(如果边界框不冲突,图形也不会冲突),您仍然可以使用它作为更快的预检查来消除明显的情况。

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

让您旋转的枢轴为(x1,y1),第二个矩形枢轴为(x2,y2)

1,用旋转的枢轴创建一个圆,以矩形的角度为半径(让半径为r1)

2.对第二个矩形执行相同的操作(半径为r2)

3.标记d为2个圆心之间的距离。 使用两点之间的距离公式a = Math.pow((x2-x1),2)b =((y2-y1),2)distance = Math.sqrt(a + b)

4.计算r1 + r2

5.如果r1 + r2> =距离,则两个矩形在一个点处相交

6.否则他们没有相交

我在这里提供链接,它们根据条件1 if(r1 + r2)= distance和2 if(r1 + r2)> distance相交存在1或2个点的链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM