Libgdx有沒有辦法驗證Polygon和Circle之間的碰撞?Circle和Polygon與Libgdx碰撞
我看到Intersector
類,但只發現了Circle和Rectangle的碰撞測試。那麼其他多邊形呢?
如果我需要手動執行,使用Libgdx的最佳方法是什麼?
Libgdx有沒有辦法驗證Polygon和Circle之間的碰撞?Circle和Polygon與Libgdx碰撞
我看到Intersector
類,但只發現了Circle和Rectangle的碰撞測試。那麼其他多邊形呢?
如果我需要手動執行,使用Libgdx的最佳方法是什麼?
所以,我設法創建了一個圓和多邊形之間的碰撞測試方法。至少,它適用於我。
下面的代碼:
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;
}
可悲的是我沒有足夠的信譽發表評論,所以我將以此作爲另一種答案,而不是...
克里斯蒂亞諾的出色答卷工程檢查的圓圈與多邊形的一條線段重疊,但它不檢查圓圈完全包含在多邊形內的更爲罕見的情況,這可能會在小的快速移動的圓與大的多邊形相碰撞時發生。
我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);
}
好吧,當時我只需要檢查外面的碰撞,所以我不知道。感謝您的更新;) – 2015-04-30 09:40:47
這需要進入libgdx。 – 2017-01-17 21:42:28
只要確保不在方法內創建新的向量,否則使用的內存會膨脹得很快。使用'tmpVector2.set(x,y)'代替'new Vector2(x,y)'(其中'tmpVector2'是一個字段)。 – 2017-01-18 11:47:36
...並跟進菲爾·安德森的出色答卷,這裏是我的版本,它只是避免了創造新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);
}
}
請問用折線代替多邊形此代碼的工作? – Vetalll 2015-02-19 15:38:34
對不起,我不知道,因爲我提出這個問題在2年前提問=/ – 2015-02-20 21:46:07
我檢查了這段代碼。是的,這是兩種變體的工作代碼。多邊形和PolyLine – Vetalll 2015-02-23 09:43:36