J'ai écrit ce code avant une dernière tentative avec Google et de trouver cette page, alors j'ai pensé que je devais le partager. Il s'agit essentiellement d'une version optimisée de la réponse de Kisielewicz. J'ai également examiné la méthode barycentrique, mais à en juger par l'article de Wikipedia, j'ai du mal à voir en quoi elle est plus efficace (je suppose qu'il existe une équivalence plus profonde). Quoi qu'il en soit, cet algorithme a l'avantage de ne pas utiliser la division ; un problème potentiel est le comportement de la détection des bords en fonction de l'orientation.
bool intpoint_inside_trigon(intPoint s, intPoint a, intPoint b, intPoint c)
{
int as_x = s.x-a.x;
int as_y = s.y-a.y;
bool s_ab = (b.x-a.x)*as_y-(b.y-a.y)*as_x > 0;
if((c.x-a.x)*as_y-(c.y-a.y)*as_x > 0 == s_ab) return false;
if((c.x-b.x)*(s.y-b.y)-(c.y-b.y)*(s.x-b.x) > 0 != s_ab) return false;
return true;
}
En mots, l'idée est la suivante : Le point s est-il à gauche ou à droite des deux lignes AB et AC ? Si c'est vrai, il ne peut pas être à l'intérieur. Si c'est faux, il est au moins à l'intérieur des "cônes" qui satisfont à la condition. Maintenant, puisque nous savons qu'un point à l'intérieur d'un trigone (triangle) doit être du même côté de AB que BC (et aussi CA), nous vérifions s'ils diffèrent. Si c'est le cas, s ne peut pas être à l'intérieur, sinon s doit être à l'intérieur.
Quelques mots-clés dans les calculs sont les demi-plans de lignes et le déterminant (produit en croix 2x2). Peut-être qu'une manière plus pédagogique est probablement de penser qu'un point est à l'intérieur s'il est du même côté (gauche ou droite) de chacune des lignes AB, BC et CA. La méthode ci-dessus semblait cependant mieux convenir à une certaine optimisation.
28 votes
J'ai écrit un article complet sur le test du point dans le triangle. Il montre les méthodes barycentriques, paramétriques et basées sur le produit scalaire. Ensuite, il traite du problème de précision qui survient lorsqu'un point se trouve exactement sur une arête (avec des exemples). Enfin, il expose une toute nouvelle méthode basée sur la distance point-arête. totologic.blogspot.fr/2014/01/ Profitez-en !
4 votes
Question similaire pour 3D
1 votes
Il convient de noter que toutes les méthodes abordées ici sont également valables dans l'espace 3D. Elles doivent simplement être précédées d'une transformation de coordonnées (et d'une projection appropriée du point sur le plan du triangle). Un triangle est un objet bidimensionnel.
0 votes
Pour une solution indépendante de l'ordre d'enroulement. Voici un bricolage fonctionnel : jsfiddle.net/ibowankenobi/oex3pzq2
2 votes
Je vote pour clore cette question parce qu'elle concerne les mathématiques plutôt que la programmation et qu'elle est basée sur l'opinion (qu'est-ce qui est "facile" pour vous ?).