Savoir si un point (3d) est dans un triangle / pyramide

Description

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.

Codes Sources

A voir également

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.