Developpez.com - Algorithmique

Le Club des Développeurs et IT Pro

Déterminer si un point est dans un triangle

Un billet de blog de wiwaxia

Le 01/05/2017, par wiwaxia, Membre émérite
Il y a parfois des sujets qui surgissent d'une manière sporadique sur les forums, comme cela vient encore de se produire il y a quelques jours: la question de savoir si un point se trouve dans un triangle, initialement exprimée en juin 2003 (cinq messages), a suscité une correction de code en juillet 2009, puis deux questions en mai 2011 (malheureusement restées sans réponse) et tout dernièrement la mention d'un lien sur la Toile.

Je venais moi-même de poster un commentaire lorsque m'est apparu l'étalement des dates (14 ans ! ) ... D'où un retrait immédiat du message, conscient du ridicule achevé de la situation, et de ce que la généralisation d'une telle pratique dénaturerait complètement les échanges sur les forums.

Rien à voir évidemment avec l'intérêt de la question, parfois exprimée en d'autres occasions. et à laquelle d'autres intervenants ont apporté de bonnes réponses. Ce sont quelques développements particuliers qui me sont venus en tête.

# Dans le plan (xOy) d'un repère orthonormé direct (Oxyz) contenant le triangle (ABC) et un point quelconque (M), la recherche de la réponse passe évidemment par le calcul de trois déterminants (ou produits mixtes, ce qui revient au même):

QA = Det(MB, MC) = uz│(MB×MC) ,
QB = Det(MC, MA) = uz│(MC×MA) ,
QC = Det(MA, MB) = uz│(MA×MB) .

(M) appartenant à (ABC) si et seulement si les trois termes précédents possèdent le même signe, et vérifient par conséquent la condition:
Code :
Test:= ((Qa*Qb>0) AND (Qb*Qc>0))
Les triangles (MAB), (MBC) et (MCA) présentent alors la même orientation intrinsèque, identique à celle de (ABC); ils sont tous directs quand les déterminants sont positifs, rétrogrades dans le cas contraire.

# Toutefois lorsqu'un grand nombre de vérifications s'avère nécessaire, un autre test permet de se dispenser souvent du calcul précédent par le rejet préalable des points (M) situés à l'extérieur du rectangle circonscrit au triangle (ABC), et d'arêtes parallèles aux axes (x'x, y'y).
Il suffit de déterminer les valeurs extrêmes des coordonnées des 3 sommets:
Xmin = Min(XA, XB, XC) , Xmax = Max(XA, XB, XC) , etc ...
puis d'effectuer le test:
Code :
Test1:= ((Xmin<x) AND (x<Xmax)) AND ((Ymin<y) AND (y<Ymax))
La condition d'intériorité au triangle (ABC) intervient ensuite - et seulement dans ce cas:
Code :
Test2:= ((Qa*Qb>0) AND (Qb*Qc>0))
(le second test est vrai dans les zones bleutées du graphe).

  Billet blog