2010-10-05 10 views
6

Nie mogę znaleźć spójnej metody do znalezienia podpisanej odległości między punktem a płaszczyzną. Jak mogę to obliczyć biorąc pod uwagę płaszczyznę zdefiniowaną jako punkt i normalny?podpisana odległość między płaszczyzną a punktem

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

dlaczego dist = dotProduct (dif, dif)? odległość powinna wynosić: d (P, * B); ?? – Pavan

+0

d (p, b) po prostu nazywa to = normą (sqrt (kropka (p - b, p - b))); –

+0

Więc mój kod robi to samo. –

Odpowiedz

18

Robisz rzeczy zbyt skomplikowane. Jeśli twój normalny jest znormalizowany, możesz to zrobić:

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

Przepraszam, ale nie mogłem zrozumieć, w jaki sposób produkt dot może wytworzyć odległość między 'p.normal' a' point - p.point'. Czy możesz wyjaśnić (może używając obrazu), że? W moim przypadku 'p.normal = (1, 0, 0)' i 'point - p.point = (-200, 0, 0)'. –

+0

@ user26409021: Chodzi o znalezienie podpisanej odległości między 'point' a' p'. W twoim przypadku, jak myślisz, co to jest? Myślę, że to -200. – Beta

+0

Tak, wiem, że daje mi odległość, która '-200' ..Czy to prawda, że ​​jeśli powiem, używając "dotProduct", możemy znaleźć odległość między 2 punktami? –

2

Nie martw się, rozumiem dokładnie, jak się czujesz. Zakładam, że chcesz trochę fragmentów kodu. więc możesz go wdrożyć we własnym zakresie. musisz wykonać znacznie więcej pracy, niż tylko dowiedzieć się o produkcie dot.

To do ciebie, aby zrozumieć ten algorytm i wdrożyć je w swoim programie co będę robić to daje implementację tego algorytmu

podpisał odległość między punktem a płaszczyzną

Oto przykładowe implementacje tych algorytmów "C++".

// 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); 
} 

Zrobione stąd: http://www.softsurfer.com/Archive/algorithm_0104/algorithm_0104.htm

PK

+0

Hmm, odległość wydaje się dokładna, ale nigdy nie jest ujemna. Czy na pewno jest to podpisane? –

+0

Tak. Wzory te dają wyznaczoną odległość, która jest dodatnia po jednej stronie płaszczyzny, a ujemna po drugiej. I tak naprawdę to jest dokładne. – Pavan

+0

Ok Edytowałem, żeby pokazać moją adaptację tego kodu. Czy wszystko wygląda dobrze? –

Powiązane problemy