2013-03-10 17 views
8

多角形と円の衝突をLibgdxで確認する方法はありますか?Libgdxと円と多角形の衝突

私はIntersectorクラスを見ましたが、円と矩形の衝突テストしか見つかりませんでした。他のポリゴンはどうですか?

手動で行う必要がある場合は、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

+0

申し訳ありませんが、私は2年前にこの質問/回答を作ったので分かりません=/ –

+0

このコードをチェックしました。はい、両方のバリアントの作業コードです。ポリゴンとポリライン – Vetalll

9

...

クリスティアーノの優れた答えがあることを確認するために働きます円はポリゴンの線分の1つに重なっていますが、ポリゴン内に完全に含まれる円の異常なケースはチェックされません。小さな円の移動円が大きなポリゴンに衝突した場合に発生する可能性があります。

私は問題を解決するための小さな変化に対応し、以下のクリスティアーノのコード...

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

ああ、私はその外の衝突をチェックする必要があった頃、私はそれを知らなかった。アップデートありがとう;) –

+0

これはlibgdxに入る必要があります。 –

+0

メソッドの中に新しいベクトルを作成しないようにしてください。さもなければ、使用されたメモリは高速に膨張します。 'new Vector2(x、y)'( 'tmpVector2'はフィールド)の代わりに' tmpVector2.set(x、y) 'のようなものを使用してください。 –

0

をrepastedきた...とフィル・アンダーソンの優秀な答えをフォローアップするために、ここでは単に新しいを作成回避私のバージョンですチェック毎に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); 
} 

}