2017-07-30 217 views
1

好的,所以我知道这个问题已经被问了一百万次,但是我有一个稍微不同的问题。我有多边形对象,这些对象由1个单元“块”组成,我需要确定这些块是否相互接触。其他答案有这样的代码:Java - 形状碰撞检测

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

    // Do collision stuff here 

} 

这有虽然问题,这就是,如果形状是彼此相邻(他们是触摸),这将不报告的碰撞。

我最初的想法是让一个Polygon在其周围有一个单位边框,所以如果它们彼此相邻,则边框将与第二个Polygon相交,并且会碰撞。我似乎无法找到添加边框的方法。

非常感谢帮助!

编辑:

如果此问题,所有的块在大小1x1的单元,并且被存储在“块”(与一个ArrayList)。我的多边形对象代表了一大块对象。如果有更好的方法来做到这一点,请让我知道!

我的代码需要为efficent越好,因为我可能有几百块/千块,而物理循环运行每隔1秒

+0

我们在这里说2d还是3d多边形? – kasoban

+0

我正在使用2D多边形 – atoms118

回答

0

好吧,我想我有一个解决方案,请评论,如果我有这个权利。

我将使用块的ArrayList中创造每块3单元宽的矩形(其中X - 1),而不是1个单元块,这应该给我1个单元周围的边框区域对象:

​​

我还留着我原来的方法查找块的区域,然后我可以检查碰撞与此:

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

    // Collision stuff here 

} 

确实增加的表现,我的块类将同时缓存方法返回该地区,因此该地区对象只会在物理循环修改chun时生成KS。

不知道这是否真的是最好的方式来做到这一点,因为这意味着在我的情况下,我将需要每块内存中的4个Area对象,这并不理想。我不会标记这个答案驴接受,除非它得到许多upvotes,因为我仍然更喜欢更有效的方式来做到这一点。

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

...但是如果形状彼此相邻而不是重叠,它会返回true吗? – atoms118

+0

@ atoms118如果发生碰撞,它将返回true。 – Akash

+0

我刚刚尝试过这些代码;如果形状彼此重叠,则此方法仅返回true,但如果它们彼此相邻则不会返回true。我使用矩形(0,0,1,1)和矩形(1,0,1,1)。这些矩形彼此相邻,但该方法返回false。我想你可能误解了这个问题 – atoms118