10
votes

Colision cercle et polygone avec libgdx

Y a-t-il un moyen de vérifier une collision entre un polygone et un cercle?

J'ai vu la classe intersecteur mais trouvé uniquement test de collision pour le cercle et le rectangle. Qu'en est-il de tout autre polygone?

Si je dois le faire manuellement, quelle est la meilleure façon de le faire en utilisant libgdx?


0 commentaires

3 Réponses :


13
votes

Donc, j'ai réussi à créer une méthode de test de collision entre un cercle et un polygone. Au moins, cela fonctionne pour moi.

Voici le code: xxx


3 commentaires

Ce code fonctionnera-t-il avec polyligne au lieu de polygone?


Désolé, je ne sais pas depuis que j'ai fait cette question / réponse à 2 ans il y a 2 ans = /


J'ai vérifié ce code. Oui, il s'agit de code de travail pour les deux variantes. Polygone et polyligne



13
votes

Malheureusement, je n'ai pas assez de réputation à commenter, je n'aijoute donc pas cela comme une autre réponse ...

L'excellente réponse de Cristiano fonctionne pour vérifier que le cercle chevauche l'un des segments de ligne du polygone, mais elle ne vérifie pas le cas plus inhabituel du cercle entièrement contenu à l'intérieur du polygone, ce qui pourrait se produire si un petit cercle de déplacement rapide est entré en collision avec un grand polygone. P>

J'ai réparé le code de Cristiano ci-dessous avec un Petit changement pour résoudre le problème ... P>

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);
}


3 commentaires

Ah OK, à ce moment-là, je n'avais que besoin de vérifier les collisions à l'extérieur, je ne le savais pas. Merci pour la mise à jour ;)


Cela doit aller à Libgdx.


Assurez-vous simplement de ne pas créer de nouveaux vecteurs à l'intérieur de la méthode, sinon la mémoire utilisée bloquez rapidement. Utilisez quelque chose comme tmpvector2.set (x, y) à la place de nouveau vector2 (x, y) (où tmpvector2 est un champ).



0
votes

... et pour suivre une excellente réponse de Phil Anderson, voici ma version qui évite simplement de créer de nouveaux vector2s chaque chèque et utilise plutôt des instances statiques de vector2. xxx

} < / p>


0 commentaires