Collision avec un segment

cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018 - 21 mai 2009 à 17:31
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018 - 24 mai 2009 à 14:00
Bonjour,

Dans le cadre de développement d'un mini jeu, je doit faire régulièrement des vérifications de collisions entre des cercles ou des points et des segments.

La détection entre un segment et un cercle marche très bien avec le code si dessous (qui est une application du théorème d'al kaishi) mais dès que je veut mettre un rayon de 0 en paramètre pour détecter un point (par exemple un click) cela ne marche pas.

A défaut de trouver le correctif rendant ce morceau de code viable pour les cercles et les points, quelqu'un peut-il poster une méthode simple et efficace qui permet de vérifier si un point est bien dans un segment?

(j'ai essayé d'autre méthode qui utilise les principes de colinéarité de vecteur, etc, mais ça ne veut pas marcher non plus, à n'y rien comprendre).

Voici mon code :

public bool collideCercle(int rayon, Vector2 centre)
         {

             for (int i = 0; i < nombreNoeuds; i++)
             {

                 if (Math.Abs(noeuds[i].X - centre.X) <= rayon && Math.Abs(noeuds[i].Y - centre.Y) <= rayon)
                     return true;

                     float projeté;
                     float ACentre;
                     float BCentre;
                     float AB;

                     float maxACentre;
                  

                     float angleSegmentSegCentre;
                   
                     if (i < nombreNoeuds - 1)
                     {
                         ACentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i].X),2) + Math.Pow((centre.Y - noeuds[i].Y),2) );
                         BCentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i + 1].X) ,2)+Math.Pow((centre.Y - noeuds[i + 1].Y),2));
                         AB = (float)Math.Sqrt(Math.Pow((noeuds[i].X - noeuds[i + 1].X),2)+Math.Pow((noeuds[i].Y - noeuds[i + 1].Y),2));

                         angleSegmentSegCentre = (float)Math.Acos((Math.Pow(ACentre,2)+Math.Pow( AB,2) - Math.Pow(BCentre,2)) / (2 * AB * ACentre));
                        
                         projeté = ACentre * (float)Math.Sin(angleSegmentSegCentre);

                         maxACentre = (float)Math.Sqrt(Math.Pow(projeté,2) + Math.Pow(AB,2));
                      
                         if (projeté <= rayon && ACentre <= maxACentre && BCentre <= maxACentre)
                                 return true;
                        
                     }
                     else
                     {
                         ACentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i].X), 2) + Math.Pow((centre.Y - noeuds[i].Y), 2));
                         BCentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[ 0].X), 2) + Math.Pow((centre.Y - noeuds[ 0].Y), 2));
                         AB = (float)Math.Sqrt(Math.Pow((noeuds[i].X - noeuds[ 0].X), 2) + Math.Pow((noeuds[i].Y - noeuds[ 0].Y), 2));

                         angleSegmentSegCentre = (float)Math.Acos((Math.Pow(ACentre, 2) + Math.Pow(AB, 2) - Math.Pow(BCentre, 2)) / (2 * AB * ACentre));

                         projeté = ACentre * (float)Math.Sin(angleSegmentSegCentre);

                         maxACentre = (float)Math.Sqrt(Math.Pow(projeté, 2) + Math.Pow(AB, 2));

                         if (projeté <= rayon && ACentre <= maxACentre && BCentre <= maxACentre)
                             return true;

                     }

                
                
             }
             return false;

         }

Merci de votre attention

Cordialement,

KiTe.

2 réponses

cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
22 mai 2009 à 14:55
Pour détecter si un point est sur un segment il suffit de calculer la distance entre le point A du segment et le point P ainsi que la distance entre le point P et le point B. Si la somme des 2 distances vaut la longueur du segment AB alors le point est sur le segment.

  A                P                        B
  +-----------+----------------+
  <-----------><--------------->
 
0
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
24 mai 2009 à 14:00
Bonjour,

J'avais aussi testé cette méthode qui marchait plutôt bien, mais certains points ne passaient pas, sans savoir pourquoi ...

J'ai testé la méthode que vous avez posté, la vérification de colinéarité, la méthode d'Al Kashi et d'autres, mais dans tous les cas il y avait des imprécisions plus ou moindre ... sans pour autant trouver d'où elles venaient =S.

En tout cas merci d'avoir pris le temps de m'aider, je vais continuer à faire des tests d'ici peu ^^

Cordialement

KiTe.
_____________________________________
La connaissance est le plus précieux des trésors.
0
Rejoignez-nous