Comment savoir si un point est à l'intérieur d'un triangle ?


Page d'accueil

Pour que le point (X,Y) soit effectivement dans le triangle ABC sa coordonnée Y doit être comprise entre le sommet le plus haut (A) et le plus bas (C) du triangle . On va donc trier les sommets en fonction de leurs coordonnées Y .
Nous allons ensuite calculer la coordonnée X du point D ce situant sur le segment AC :
Si le point se situe entre A et B on va calculer les coordonnées x1 et x2 d'une ligne du triangle ABD avec Y égal au point XY . Si la coordonnée X du point est entre x1 et x2 le point est dans le triangle . On procèdera de même pour le triangle BCD .

LISTING en GFA-Basic :


Faites un copier-coller
ou
cliquez ici pour télécharger le fichier LST.
(si le fichier s'ouvre dans une nouvelle fenêtre faites un clic droit et choisir "Enregistrer la cible sous...")

FUNCTION PointInTriangle(x,y,x1,y1,x2,y2,x3,y3)

 
// Date création : 19 09 2002
 // Auteur : Nicolas REY
 // Site : scalion.free.fr
 // x,y sont les coordonnées du point
 // x1,y1,x2,y2,x3,y3 sont les coordonnées du triangle
 // La fonction renvoie TRUE (-1) si le point est dans le triangle
 // sinon renvoie FALSE (0)

 
LOCAL Inter_X,RAPPORT,vx1,vx2,r%

 
IF y1 > y2     ' Trier les sommets en fonction de leurs coordonnêe Y
   
SWAP x1,x2
   
SWAP y1,y2
 
ENDIF
 IF
y1 > y3
   
SWAP x1,x3
   
SWAP y1,y3
 
ENDIF
 IF
y2 > y3
   
SWAP x2,x3
   
SWAP y2,y3
 
ENDIF

 
Inter_X = x1 ' Inter_X est le point D dans le segment AC
 
IF y1 <> y2  THEN Inter_X = Inter_X + (x3 - x1) / ( (y3 - y1) / (y2 - y1)  )

 IF
y < y1 OR y > y3    ' Si le point est au dessus ou en dessous du triangle
   
r% = FALSE
 ELSE
   IF
y > y2  ' Si le point est peut être dans le triangle infêrieur...
     
RAPPORT = (y3 - y2) / (y - y2)
     
vx1 = Inter_X + (x3 - Inter_X) / RAPPORT
     vx2
= x2 + (x3 - x2) / RAPPORT
     
IF vx2 < vx1 THEN SWAP vx1,vx2
     IF x >= vx1
       
IF x <= vx2 THEN r% = TRUE
     ENDIF
   ELSE IF
y > y1  ' ...ou dans le triangle supêrieur...
     
RAPPORT = (y2 - y1) / (y - y1)
     
vx1 = x1 + (Inter_X - x1) / RAPPORT
     vx2
= x1 + (x2 - x1) / RAPPORT
     
IF vx2 < vx1 THEN SWAP vx1,vx2
     
IF x >= vx1
       
IF x <= vx2 THEN r% = TRUE
     ENDIF
   ELSE IF
y = y2  '... voir entre les deux !
     
IF Inter_X > x2 THEN SWAP x2,Inter_X
     
IF x >= x2
       
IF x <= Inter_X THEN  r% = TRUE
     ENDIF
   ENDIF
 ENDIF

 RETURN
r%

ENDFUNC