Voici la généralisation directe de ma source pour le cas 2D. Je poste cette source car plusieurs messages circulaient sur ce sujet
Source / Exemple :
' tout se trouve dans le zip, mais voici ici la fonction principale du programme
' entrée des données
For i = 1 To 3
A(i) = CDbl(txtA(i - 1).Text)
B(i) = CDbl(txtB(i - 1).Text)
C(i) = CDbl(txtC(i - 1).Text)
D(i) = CDbl(txtD(i - 1).Text)
P(i) = CDbl(txtP(i - 1).Text) - A(i)
u(i) = B(i) - A(i)
v(i) = C(i) - A(i)
w(i) = D(i) - A(i)
Next
' pour le triangle, le vecteur w est choisi (arbitrairement) comme u x v
If optType(0).Value Then
w(1) = u(2) * v(3) - u(3) * v(2)
w(2) = u(3) * v(1) - u(1) * v(3)
w(3) = u(1) * v(2) - u(2) * v(1)
End If
' matrice de changement de base
For i = 1 To 3
M(i, 1) = u(i)
M(i, 2) = v(i)
M(i, 3) = w(i)
Next
Inverse M, MInv
' Q = nouvelles coordonnées du point P
Q(1) = MInv(1, 1) * P(1) + MInv(1, 2) * P(2) + MInv(1, 3) * P(3)
Q(2) = MInv(2, 1) * P(1) + MInv(2, 2) * P(2) + MInv(2, 3) * P(3)
Q(3) = MInv(3, 1) * P(1) + MInv(3, 2) * P(2) + MInv(3, 3) * P(3)
' vérification de la position du point P
If optType(0).Value Then Resultat = 2 Else Resultat = 4
If Q(1) >= -DELTA And Q(2) >= -DELTA And Q(3) >= -DELTA And _
Q(1) + Q(2) + Q(3) <= 1 + DELTA Then
If optType(1).Value Or Abs(Q(3)) < DELTA Then
Resultat = Resultat - 1
End If
End If
' affichage du résultat
lblResultat.Visible = True
Select Case Resultat
Case 1: strResultat = "le point P se trouve dans le triangle ABC"
Case 2: strResultat = "le point P ne se trouve pas dans le triangle ABC"
Case 3: strResultat = "le point P se trouve dans la pyramide ABCD"
Case 4: strResultat = "le point P ne se trouve pas dans la pyramide ABCD"
End Select
lblResultat.Caption = strResultat
Conclusion :
L'interface est très rudimentaire, le but étant d'utiliser les fonctions dans vos programmes. Ce code est donc fait uniquement pour comprendre comment ça marche, alors n'essayez pas de rentrer autre chose que des chiffres dans les cases de coordonnées, je n'ai fait aucun contrôle de type de données!
Pour savoir si un point P (3D) se trouve dans un triangle ABC, il existe une autre méthode que celle donnée ici:
on projette le triangle ABC et le point P sur les plans XY, XZ et YZ (càd qu'on "oublie" une composante à chaque fois), et on vérifie avec le programme 2D (calculs légèrement plus simples) que la projection de P se trouve les 3 fois à l'intérieur de la projection du triangle.
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.