Savoir si un point (2d) est dans un triangle

Soyez le premier à donner votre avis sur cette source.

Vue 4 661 fois - Téléchargée 289 fois

Description

Un petit exemple complet est disponible dans le fichier zip.
Si vous êtes amateur de maths et que vous voulez comprendre le principe de ce code, lisez ce qui suit, sinon utilisez cette fonction les yeux fermés ! Pour savoir si un point est dans le triangle, on procède à un changement de base : la nouvelle base est formée par un des sommets du triangle (->l'origine) et les 2 côtés correspondants (->Ox et Oy). On transforme les coordonnées du point dans cette nouvelle base et on regarde que les composantes soient >0 et <1.

Source / Exemple :


' On considère un triangle formé par les 3
' sommets (X,Y) -> X(0 to 2) et Y(0 to 2) as double
' On appelle la fonction Interieur(pX,pY) pour
' savoir si le point (pX,pY) se trouve à 
' l'intérieur du triangle.

private function Interieur( _ 
  byval pX as double, byval pY as double) _ 
  as boolean
dim Det as double
dim Temp as double
dim M(0 to 1, 0 to 1) as double

  M(0,0)=X(1)-X(0)
  M(1,0)=Y(1)-Y(0)
  M(0,1)=X(2)-X(0)
  M(1,1)=Y(2)-Y(0)

  Det=M(0,0)*M(1,1)-M(1,0)*M(0,1)

  ' Vérifie que le triangle en est un !
  if Det = 0 then
    Interieur = false
    exit function
  else
  ' Changement de base
    pX = pX - X(0)
    pY = pY - Y(0)
    Temp = (pX*M(1,1)-pY*M(0,1))/Det
    pY = (-pX*M(1,0)+pY*M(0,0))/Det
    pX = Temp
    if pX>0 and pY>0 and pX+pY<1 then
      Interieur = true
    else
      Interieur = false
    end if
  end if

end function

Conclusion :


A partir de cette méthode, on peut regarder si un point se trouve à l'intérieur d'un parallèlogramme (changer la condition "if pX>0 and pY>0 and pX+pY<1" en "if pX>0 and pX<1 and pY>0 and pY<1"), et, en passant en 3D, on peut savoir si un point se trouve dans une pyramide, ...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

VbMaster
Messages postés
21
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
15 avril 2004

Il y a + simple et + rapide :
la fonction PtInRegion :
Public Declare Function PtInRegion Lib "gdi32" Alias "PtInRegion" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long

Avec ça, on peut même gérer les polygones, les cercles, etc... Suffit de faire la région correspondante... Enfin quand même, c'est pas mal pour la technique

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.