2013-03-10 120 views
8

Libgdx有沒有辦法驗證Polygon和Circle之間的碰撞?Circle和Polygon與Libgdx碰撞

我看到Intersector類,但只發現了Circle和Rectangle的碰撞測試。那麼其他多邊形呢?

如果我需要手動執行,使用Libgdx的最佳方法是什麼?

回答

10

所以,我設法創建了一個圓和多邊形之間的碰撞測試方法。至少,它適用於我。

下面的代碼:

public boolean overlaps(Polygon polygon, Circle circle) { 
    float []vertices=polygon.getTransformedVertices(); 
    Vector2 center=new Vector2(circle.x, circle.y); 
    float squareRadius=circle.radius*circle.radius; 
    for (int i=0;i<vertices.length;i+=2){ 
     if (i==0){ 
      if (Intersector.intersectSegmentCircle(new Vector2(vertices[vertices.length-2], vertices[vertices.length-1]), new Vector2(vertices[i], vertices[i+1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(new Vector2(vertices[i-2], vertices[i-1]), new Vector2(vertices[i], vertices[i+1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return false; 
} 
+0

請問用折線代替多邊形此代碼的工作? – Vetalll 2015-02-19 15:38:34

+0

對不起,我不知道,因爲我提出這個問題在2年前提問=/ – 2015-02-20 21:46:07

+0

我檢查了這段代碼。是的,這是兩種變體的工作代碼。多邊形和PolyLine – Vetalll 2015-02-23 09:43:36

9

可悲的是我沒有足夠的信譽發表評論,所以我將以此作爲另一種答案,而不是...

克里斯蒂亞諾的出色答卷工程檢查的圓圈與多邊形的一條線段重疊,但它不檢查圓圈完全包含在多邊形內的更爲罕見的情況,這可能會在小的快速移動的圓與大的多邊形相碰撞時發生。

我repasted克里斯蒂亞諾的代碼下面有小的改變來解決問題...

public static boolean overlaps(Polygon polygon, Circle circle) { 
    float []vertices=polygon.getTransformedVertices(); 
    Vector2 center=new Vector2(circle.x, circle.y); 
    float squareRadius=circle.radius*circle.radius; 
    for (int i=0;i<vertices.length;i+=2){ 
     if (i==0){ 
      if (Intersector.intersectSegmentCircle(new Vector2(vertices[vertices.length - 2], vertices[vertices.length - 1]), new Vector2(vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(new Vector2(vertices[i-2], vertices[i-1]), new Vector2(vertices[i], vertices[i+1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return polygon.contains(circle.x, circle.y); 
} 
+0

好吧,當時我只需要檢查外面的碰撞,所以我不知道。感謝您的更新;) – 2015-04-30 09:40:47

+0

這需要進入libgdx。 – 2017-01-17 21:42:28

+0

只要確保不在方法內創建新的向量,否則使用的內存會膨脹得很快。使用'tmpVector2.set(x,y)'代替'new Vector2(x,y)'(其中'tmpVector2'是一個字段)。 – 2017-01-18 11:47:36

0

...並跟進菲爾·安德森的出色答卷,這裏是我的版本,它只是避免了創造新Vector2s每次檢查,而是重新使用Vector2的靜態實例。

public class PolygonUtil { 

static final Vector2 center = new Vector2(); 
static final Vector2 vec1 = new Vector2(); 
static final Vector2 vec2 = new Vector2(); 

public static boolean overlaps(Polygon polygon, Circle circle) { 
    float []vertices=polygon.getTransformedVertices(); 
    center.set(circle.x, circle.y); 
    float squareRadius=circle.radius*circle.radius; 
    for (int i=0;i<vertices.length;i+=2){ 
     if (i==0){ 
      if (Intersector.intersectSegmentCircle(vec1.set(vertices[vertices.length - 2], vertices[vertices.length - 1]), 
        vec2.set(vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(vec1.set(vertices[i-2], vertices[i-1]), vec2.set(vertices[i], vertices[i+1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return polygon.contains(circle.x, circle.y); 
} 

}