10

Polygon と Circle の間の衝突を検証する Libgdx の方法はありますか?

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

手動で行う必要がある場合、Libgdx を使用してそれを行う最善の方法は何ですか?

4

3 に答える 3

14

悲しいことに、コメントするのに十分な評判がないので、代わりにこれを別の回答として追加しています...

クリスティアーノの優れた答えは、円が多角形の線分の 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);
}
于 2015-04-29T08:44:15.497 に答える
13

それで、円と多角形の間の衝突テスト メソッドを作成することができました。少なくとも、それは私にとってはうまくいきます。

コードは次のとおりです。

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;
}
于 2013-03-20T22:59:45.193 に答える