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 对象,这并不理想。除非得到很多赞成票,否则我不会将此答案标记为已接受,因为我仍然更喜欢一种更有效的方法。
好的,所以我知道这个问题已经被问过一百万次了,但我的问题略有不同。我有 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 对象,这并不理想。除非得到很多赞成票,否则我不会将此答案标记为已接受,因为我仍然更喜欢一种更有效的方法。