Java - 形状碰撞检测

Java - Shape Collision Detection

好的,所以我知道这个问题已经被问过一百万次了,但我的问题略有不同。我有 Polygon 对象,它们由 1 个单位 "blocks" 组成,我需要确定这些块是否相互接触。其他答案有这样的代码:

Area area1 = new Area(poly1);
Area area2 = new Area(poly2);
area1.instersect(poly2);
if(!area1.isEmpty()) {

    // Do collision stuff here

}

但这有一个问题,那就是如果形状彼此相邻(它们正在接触),则不会报告碰撞。

我最初的想法是让一个多边形周围有一个 1 个单位的边界,所以如果它们彼此相邻,边界将与第二个多边形相交并且我会发生碰撞。不过我似乎找不到添加边框的方法。

非常感谢帮助!

编辑:

如果这很重要,所有块的大小都是 1x1 单位,并存储在 "chunks"(使用 ArrayList)中。我的多边形对象代表一整块对象。如果有更好的方法,请告诉我!

我的代码需要尽可能高效,因为我可能有数百个 chunks/thousands 块,并且物理循环每 1 秒运行一次

public static boolean checkCollision(Shape shapeA, Shape shapeB) {
   Area areaA = new Area(shapeA);
   areaA.intersect(new Area(shapeB));
   return !areaA.isEmpty();
}

好的,我想我有一个解决方案,如果我做对了请评论。

我将使用块的 ArrayList 为每个块创建 3 个单位宽的矩形(x - 1)而不是 1 个单位块,这应该在 Area 对象周围给我一个 1 个单位的边框:

public Area calculateHitboxArea() {
    Area area = new Area();
    for(int i = 0; i < getMass(); i++) {
        Block block = getBlock(i);
        area.add(new Area(new Rectangle(block.getX() - 1, block.getY() - 1, 3, 3)));
    }
    return area;
}

我还保留了我原来的寻找块区域的方法,然后我可以用这个检查碰撞:

Area area1 = chunk1.calculateHitboxArea();
Area area2 = chunk2.calculateArea();
area1.intersect(area2);
if(!area1.isEmpty()) {

    // Collision stuff here

}

提高性能,我的块 class 将缓存区域两种方法 return,因此区域对象只会在物理循环修改块时生成。

不确定这是否真的是执行此操作的最佳方法,因为在我的情况下,这意味着每个块在内存中需要 4 个 Area 对象,这并不理想。除非得到很多赞成票,否则我不会将此答案标记为已接受,因为我仍然更喜欢一种更有效的方法。