首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个旋转矩形间的java碰撞检测

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

Stack Overflow用户
提问于 2016-02-13 23:35:20
回答 2查看 1.3K关注 0票数 0

我正在试着判断两个rectangles是否在碰撞。如果矩形不是旋转的,我就没有问题,但是当它们都旋转时,我的逻辑中有一些问题。下面是我目前使用的方法:

代码语言:javascript
复制
    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度引起的问题。如何解决这个问题以测试两个旋转矩形之间的碰撞?任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-14 00:52:34

只有两种情况下碰撞检测很简单:

  • 圆圈间
  • 在对齐矩形之间

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

可悲的是,你的案子不是上面提到的。这些矩形有不同的坐标系,因为它们的旋转边可能是向下垂直的,也可能是与第二轴平行的,所以不能这样处理。

其中一种方法是使用包围框,就像这里所做的那样:

代码语言:javascript
复制
if(a.getBounds2D().intersects(car)){
    System.out.println("Collision!");
}

调用a.getBounds2D()将创建与坐标系对齐并覆盖整个形状的矩形。但是包围盒也会覆盖一些没有被形状占据的空间。因此,检查对齐矩形和旋转矩形的包围盒之间的碰撞是快速和容易的,但可能产生如矩形的绘制和旋转矩形的包围盒。所示的假阳性。

为了完全和准确地检查碰撞,您需要使用一些更复杂的方法,比如塞特,它使用多边形在不同轴上的投射(投影)。事实上,你只使用矩形,这意味着你只需要两个轴,而且你已经知道了它们的方向。

PS。使用边框是没有错的,这是很容易检查两个数字是否没有碰撞(如果包围框不碰撞数字不能碰撞),你仍然可以使用它作为更快的预检查,以消除明显的情况。

票数 2
EN

Stack Overflow用户

发布于 2016-02-14 00:11:40

代码语言:javascript
复制
I will tell the logic instead of code here follow these works.

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

1.创建一个以旋转和矩形长度为半径(半径为r1)的枢轴圆。

2.对第二个矩形(半径为r2)也做同样的操作。

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

4.计算r1+r2

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

6.否则它们就不相交了

在这里提供链接链接,其中它们相交存在1或2个点,条件是1 if(r1+r2)=距离和2 if(r1+r2)>距离

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35386632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档