两个Shape对象之间的Java碰撞检测?

Mon*_*o10 14 java 2d intersection shape collision

我想知道判断Shape对象是否与另一个形状相交的最佳方法.目前我在我的游戏中进行了碰撞检测,只要它涉及一个与矩形相交的形状,反之亦然.我遇到的问题是Shape类中的intersects()方法只能将Rectangle或Point作为参数,而不是另一个Shape.有没有一种有效的方法来测试两个Shape对象是否以任何方式重叠?我尝试过的一种方法是使用for循环生成一个点区域来测试它们是否在形状中,然后构建一个Point对象数组以发送到另一个形状进行测试,但这显着降低了我的帧率因为所有不必要的比较.

我在这里寻找并寻找类似的东西,但没有找到任何真正的东西.如果这是重复,请提前抱歉.

use*_*343 19

未经测试,但为什么不:

import java.awt.geom.Area;

...

public static boolean testIntersection(Shape shapeA, Shape shapeB) {
   Area areaA = new Area(shapeA);
   areaA.intersect(new Area(shapeB));
   return !areaA.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

Area实现Shape,但添加了一些可能有用的方法

  • 这完全符合我的要求!非常感谢. (5认同)

Tas*_*ons 6

您还可以使用形状本身的边界,然后比较边界:

public boolean collidesWith(Shape other) {
    return shape.getBounds2D().intersects(other.getBounds2D());
}
Run Code Online (Sandbox Code Playgroud)

这对眼睛来说有点好看.

  • 这将产生边界框碰撞而不是询问者想要的形状交集。但是,这很可能比我的答案性能高得多,这是毫无价值的。一方面,没有必要制作防御性副本,因为这个 `intersect` 方法不会改变形状。此外,此`intersect` 的合同指定可以降低准确性以提高性能:http://docs.oracle.com/javase/7/docs/api/java/awt/geom/RectangularShape.html#intersects( java.awt.geom.Rectangle2D) (2认同)