2010-10-05 34 views
6

Non riesco a trovare un metodo coerente per trovare la distanza segnata tra un punto e un piano. Come posso calcolare questo dato un piano definito come un punto e un normale?distanza segnata tra piano e punto

struct Plane 
{ 
    Vec3 point; 
    Vec3 normal; 
} 
+0

perché dist = dotProduct (dif, dif)? la distanza dovrebbe essere: d (P, * B); ?? – Pavan

+0

d (p, b) chiama semplicemente questo = norma (sqrt (punto (p - b, p - b))); –

+0

Quindi il mio codice fa la stessa cosa. –

risposta

18

Stai facendo le cose troppo complicato. Se la tua normalità è normalizzata, puoi semplicemente farlo:

float dist = dotProduct(p.normal, (vectorSubtract(point, p.point))); 
+0

Mi spiace, ma non sono riuscito a capire come il prodotto di punti potesse produrre la distanza tra 'p.normal' e' point - p.point'. Puoi spiegare (magari usando la foto) per favore? Nel mio caso, 'p.normal = (1, 0, 0)' e 'point - p.point = (-200, 0, 0)'. –

+0

@ user26409021: L'idea è di trovare la distanza segnata tra 'point' e' p'. Nel tuo caso, cosa pensi che sia? Penso che sia -200. – Beta

+0

Sì, lo so, dammi la distanza che '-200' ..Quindi è corretto se dico usando 'dotProduct'potremmo trovare la distanza tra 2 punti? –

2

non ti preoccupare, capisco esattamente come ti senti. Suppongo che tu voglia alcuni frammenti di codice. così puoi implementarlo nel tuo. devi fare molto più lavoro che trovare il prodotto punto.

Spetta a voi per capire questo algoritmo e implementarlo nel proprio programma di ciò che io voglio fare è dare un'implementazione di questo algoritmo

distanza firmato tra il punto e il piano

Ecco alcuni esempi di implementazioni "C++" di questi algoritmi.

// Assume that classes are already given for the objects: 
// Point and Vector with 
//  coordinates {float x, y, z;} 
//  operators for: 
//   Point = Point ± Vector 
//   Vector = Point - Point 
//   Vector = Scalar * Vector (scalar product) 
// Plane with a point and a normal {Point V0; Vector n;} 
//=================================================================== 

// dot product (3D) which allows vector operations in arguments 
#define dot(u,v) ((u).x * (v).x + (u).y * (v).y + (u).z * (v).z) 
#define norm(v) sqrt(dot(v,v)) // norm = length of vector 
#define d(u,v)  norm(u-v)  // distance = norm of difference 

// pbase_Plane(): get base of perpendicular from point to a plane 
// Input: P = a 3D point 
//   PL = a plane with point V0 and normal n 
// Output: *B = base point on PL of perpendicular from P 
// Return: the distance from P to the plane PL 
float 
pbase_Plane(Point P, Plane PL, Point* B) 
{ 
    float sb, sn, sd; 

    sn = -dot(PL.n, (P - PL.V0)); 
    sd = dot(PL.n, PL.n); 
    sb = sn/sd; 

    *B = P + sb * PL.n; 
    return d(P, *B); 
} 

Tratto da qui: http://www.softsurfer.com/Archive/algorithm_0104/algorithm_0104.htm

PK

+0

Hmm quella distanza sembra accurata ma non è mai negativa. Sei sicuro che sia firmato? –

+0

Sì. Queste formule indicano una distanza segnata positiva su un lato del piano e negativa sull'altro. E sì, è davvero accurato. – Pavan

+0

Ok, ho modificato per mostrare il mio adattamento di quel codice. Va tutto bene? –

Problemi correlati