2017-07-30 215 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