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.