Point perpendiculaire 3D sur ligne À partir du point 3D

Cette question a déjà été posée en référence à la 2D. Cette question l’étend à la 3D. Comment trouver le point d’intersection perpendiculaire sur une ligne à partir d’un point situé dans un espace 3D?. Si ma ligne est définie par des points (x1,y1,z1) et (x2,y2,z2) et que j’ai un point (x3,y3,z3) dans l’espace.

Comment trouver l’intersection perpendiculaire du point (x4, y4, z4) sur la droite de (x3, y3, z3)?

    Pour commencer, vous avez besoin d’une certaine implémentation d’une classe Vector3 , que vous Vector3 , que vous trouviez une implémentation autonome sur Internet ou que vous utilisiez une bibliothèque qui en contient une telle que XNA ou Sharp3D.Math .

    En règle générale, les lignes dans l’espace 3D ne sont pas représentées par deux points, mais par des équations paramésortingques et exploitées par des vecteurs et non par des scalaires. Votre équation paramésortingque serait de la forme:

     x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1) 

    Le vecteur u est défini par les coefficients de t . .

    Le vecteur PQ est défini par le point Q choisi moins un point P sur la ligne. N’importe quel sharepoint la ligne peut être choisi, il serait donc plus simple d’utiliser simplement la ligne t = 0 , ce qui simplifie x1, y1 et z1.

    La définition de la distance la plus courte entre un point et une ligne sur 3 espaces est la suivante:

    D = || PQ x u || / || u ||

    x est l’opérateur du produit croisé, et || ... || || ... || obtient la magnitude du vecteur contenu. Selon la bibliothèque que vous choisissez, votre code peut varier, mais il devrait être très similaire:

     Vector3 u = new Vector3(x2 - x1, y2 - y1, z2 - z1); Vector3 pq = new Vector3(x3 - x1, y3 - y1, z3 - z1); float distance = Vector3.Cross(pq, u).Length / u.Length; 

    Edit : Je viens de me rendre compte que vous vouliez le point d’intersection et non la distance. La formule pour trouver le point réel est un peu différente. Vous devez utiliser l’espace produit interne pour obtenir le composant u perpendiculaire à PQ . Pour ce faire, vous devez trouver la composante de u dans la direction de PQ :

    (( PQ · u ) / || u || ^ 2) * u

    Cela nous donne le composant w1 , mais nous voulons w2 , qui est le composant entre Q et la ligne:

    PQ = w1 + w2

    w2 = PQw1

    De là, nous prenons w2 et l’ajoutons au point Q pour obtenir le point sur la ligne la plus proche de Q. En code ce serait:

     Vector3 p1 = new Vector3(x1, y1, z1); Vector3 p2 = new Vector3(x2, y2, z2); Vector3 q = new Vector3(x3, y3, z3); Vector3 u = p2 - p1; Vector3 pq = q - p1; Vector3 w2 = pq - Vector3.Multiply(u, Vector3.Dot(pq, u) / u.LengthSquared); Vector3 point = q - w2; 

    point.X est x4 , point.Y est point.Z et point.Z est z4 .

    Vous demandez, en pratique, le calcul d’une distance entre le point et la ligne, de sorte que la Length du vecteur à partir de (x3,y3,z3) pointe vers la ligne qui est orthogonale au vecteur. Si nous immaginons la ligne comme un vecteur, cela signifie que le produit scalaire des deux vecteurs est égal à 0 . (ceci est juste pour vous donner un indice).

    Nous pouvons également utiliser la méthode AAS Triangle.

    A - (x1,y1,z1), B - (x2,y2,z3) , C - (x3,y3,z3)

    Nous devons trouver le point D de la droite AB perpendiculaire au point C

    Maintenant nous avons des vecteurs directionnels

     VectorAC = normalize(A - C), VectorCA = normalize(C - A), VectorAB = normalize(A - B), 

    Considérons ADC comme un sortingangle

    Le produit ponctuel donne l’angle entre 2 vecteurs

     AngleA = Angle Between VectorAC and vectorAB AngleD = Angle Between VectorDC and vector DA, Always 90 deg, As VectorDC and DA are perpendicular to each other. AngleC = 180 - (AngleA + AngleD), Angle between VectorCD and VectorCA. 

    Alors maintenant nous avons 3 angle du sortingangle

    Utilisez la méthode du sortingangle AAS et trouvez la distance entre A et D.

    http://www.mathsisfun.com/algebra/sortingg-solving-aas-sortingangles.html

      D = (A + (VectorAB * Distance between A and D)). 

    J’ai fait le calcul pour la réponse marquée comme meilleure réponse:
    soit alpha = [(x3-x1) (x2-x1) + (y3-y1) (y2-y1) + (z3-z1) (z2-z1)] / [(x2-x1) (x2-x1) + (y2-y1) (y2-y1) + (z2-z1) (z2-z1)]
    point d’intersection = (x1 + alpha * (x2-x1), y1 + alpha * (y2-y1), z1 + alpha * (z2-z1)).