Polygon と Circle の間の衝突を検証する Libgdx の方法はありますか?
クラスを見ましたIntersector
が、Circle と Rectangle の衝突テストしか見つかりませんでした。他のポリゴンはどうですか?
手動で行う必要がある場合、Libgdx を使用してそれを行う最善の方法は何ですか?
Polygon と Circle の間の衝突を検証する Libgdx の方法はありますか?
クラスを見ましたIntersector
が、Circle と Rectangle の衝突テストしか見つかりませんでした。他のポリゴンはどうですか?
手動で行う必要がある場合、Libgdx を使用してそれを行う最善の方法は何ですか?
悲しいことに、コメントするのに十分な評判がないので、代わりにこれを別の回答として追加しています...
クリスティアーノの優れた答えは、円が多角形の線分の 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);
}
それで、円と多角形の間の衝突テスト メソッドを作成することができました。少なくとも、それは私にとってはうまくいきます。
コードは次のとおりです。
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;
}