1
votes

Comment obtenir la distance d'un point à un plan en 3D?

J'ai un triangle avec les points A, B, C et Point dans l'espace (P). Comment puis-je obtenir la distance d'un point à un avion? J'ai besoin de calculer la distance de P au plan, même lorsque mon triangle est éloigné (ou pas au-dessus du point, comme sur l'image).

Point et triangle:


1 commentaires

Voulez-vous dire la distance au plan d'appui ou la distance la plus courte aux points du triangle?


4 Réponses :


3
votes

Si le point est P (x1, y1, z1) et le plan est ax + by + cz + d = 0

Distance

 dist = Abs(a*x1+b*y1+c*z1+d) / Sqrt(a^2+b^2+c^2)


3 commentaires

@MBo ouais, c'est plus comme s'il rétractait le vote négatif ... btw la première approche dans le lien est ce que ma réponse est tout au sujet


La formule @Spektre avec le point de base n'inclut pas d, sans lui - inclut ( d a été ajouté par moi il y a quelques heures)


@MBo heh doit être mis en cache quelque part, je peux le voir dans l'historique des modifications maintenant, mais il y a à peine quelques minutes, pas dans la réponse elle-même ...



1
votes

Je l'ai converti en code:

var a = pos1.y * (pos2.z - pos3.z) + pos2.y * (pos3.z - pos1.z) + pos3.y * (pos1.z - pos2.z);
var b = pos1.z * (pos2.x - pos3.x) + pos2.z * (pos3.x - pos1.x) + pos3.z * (pos1.x - pos2.x); 
var c = pos1.x * (pos2.y - pos3.y) + pos2.x * (pos3.y - pos1.y) + pos3.x * (pos1.y - pos2.y);
var d = -(pos1.x * (pos2.y * pos3.z - pos3.y * pos2.z) + 
        pos2.x * (pos3.y * pos1.z - pos1.y * pos3.z) + 
        pos3.x * (pos1.y * pos2.z - pos2.y * pos1.z));


var dist = Math.Abs(a * point.x + b * point.y + c * point.z + d) / Math.Sqrt(a * a + b * b + c * c);

Cela fonctionne! Merci!


0 commentaires

3
votes

Je suppose que vous voulez calculer la distance perpendiculaire entre le point et le plan à partir de 3 points formant un triangle. Ici approche mathématique vectorielle:

  1. que les points du triangle soient p0, p1, p2 et le point testé p.

  2. plan normal

    Nous devons d'abord obtenir une normale plane, c'est-à-dire une simple multiplication vectorielle de deux vecteurs non parallèles et non nuls à l'intérieur du plan:

    U.x=p1.x-p0.x; V.x=p2.x-p0.x; // basis vectors on the plane
    U.y=p1.y-p0.y; V.y=p2.y-p0.y;
    U.z=p1.z-p0.z; V.z=p2.z-p0.z;
    n.x=(U.y*V.z)-(U.z*V.y);      // plane normal
    n.y=(U.z*V.x)-(U.x*V.z);
    n.z=(U.x*V.y)-(U.y*V.x);
    dist = sqrt( (n.x*n.x) + (n.y*n.y) + (n.z*n.z) ); // normalized
    n.x /= dist;
    n.y /= dist;
    n.z /= dist;
    dist = abs( (p.x-p0.x)*n.x + (p.y-p0.y)*n.y + (p.z-p0.z)*n.z ); // your perpendicular distance
    

    et le normaliser en vecteur unitaire (pour simplifier les choses):

    dist = |dot ( p-p0 , n )|
    
  3. distance perpendiculaire

    nous pouvons exploiter le produit scalaire pour cela, il suffit donc de créer un vecteur allant de n'importe quel point du plan vers votre point et point testé avec l'unité normale ...

    n = n/|n|
    

     perp. dist

    la dernière valeur absolue (sur la distance scalaire) supprimera simplement le signe du résultat qui vous indique si le point p est en direction de la normale n ou dans le cas contraire, une telle information est parfois souhaitée, alors dans ce cas, supprimez la valeur abs la plus externe et utilisez l'enroulement de polygone et les opérandes de produit croisé pour maintenir la direction normale souhaitée.

Ici (cherchez [edit2] ), vous trouverez la croix , point et || équations utilisées si nécessaire:

donc si je mets tout ensemble sous forme de code:

n = cross( p1-p0 , p2-p0 )


1 commentaires

C'est une réponse vraiment approfondie. Gloire. Mais, je garderais le signe pour dist . C'est utile.



1
votes

Juste une précision, il y a un échange de double signe dans la dernière réponse. Dans var d , il n'y a pas de - et pour accéder à la distance il faut calculer:

var dist = Math.Abs ​​(a * point.x + b * point.y + c * point.z - d) / Math.Sqrt (a * a + b * b + c * c);

Ne change rien à la sortie, mais si vous utilisez l'équation du plan par la suite, c'est important


0 commentaires