2011-02-01 15 views
8

mam 3d punkt P i odcinek zdefiniowany przez A i B (A jest punktem początkowym odcinka linii, B końcu).Znajdź odległość od punktu do 3d odcinek

Chcę obliczyć najkrótszą odległość między P a linią AB.

Obliczenie odległości punktu do nieskończonej linii było łatwe, ponieważ było to rozwiązanie na Wolfram Mathworld i mam to zaimplementowane, ale muszę to zrobić dla linii o skończonej długości.

nie udało się znaleźć wiarygodne rozwiązanie tego problemu w 3D po wielu rozglądać.

I realizowane algorytmy do obliczania iloczyn skalarny, iloczyn, wielkość i tak dalej C++ ze struktury, która zawiera pływaki x, y i z.

Pseudo-kod, linki lub kod w prawie każdym języku jest świetny.

+0

Tutaj masz rozwiązanie w Mathematica dla 3D (lub 2D) http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment/4165840#4165840 –

+0

Pozwolę sobie powitać Cię StackOverflow i przypomnij trzy rzeczy, które zwykle robimy tutaj: 1) Gdy otrzymasz pomoc, postaraj się jej również udzielić ** odpowiadając na pytania ** w twojej dziedzinie wiedzy 2) [Przeczytaj FAQ] (http://tinyurl.com/2vycnvr) 3) Gdy widzisz dobre pytania i odpowiedzi, zagłosuj na nie [używając "szarych trójkątów"] (http://i.imgur.com/kygEP.png), ponieważ wiarygodność systemu opiera się na reputacji, użytkownicy zyskują dzięki dzieleniu się swoją wiedzą. Pamiętaj także, aby zaakceptować odpowiedź, która lepiej rozwiązuje Twój problem, jeśli jest, [poprzez naciśnięcie znaku zaznaczenia] (http://i.imgur.com/uqJeW.png) –

Odpowiedz

5

Jest to dość proste. Najpierw potraktuj segment linii jak gdyby był nieskończony i znajdź punkt R na linii, gdzie promień prostopadły z linii na R przechodzi przez twój punkt P. Jeśli R jest pomiędzy A i B na linii, to najkrótsza odległość to PR. W przeciwnym razie odległość od brzegu jest leasingodawcą PA i PB.

4

Java funkcja

/** 
* Calculates the euclidean distance from a point to a line segment. 
* 
* @param v  the point 
* @param a  start of line segment 
* @param b  end of line segment 
* @return  distance from v to line segment [a,b] 
* 
* @author  Afonso Santos 
*/ 
public static 
double 
distanceToSegment(final R3 v, final R3 a, final R3 b) 
{ 
    final R3 ab = b.sub(a) ; 
    final R3 av = v.sub(a) ; 

    if (av.dot(ab) <= 0.0)   // Point is lagging behind start of the segment, so perpendicular distance is not viable. 
    return av.modulus() ;   // Use distance to start of segment instead. 

    final R3 bv = v.sub(b) ; 

    if (bv.dot(ab) >= 0.0)   // Point is advanced past the end of the segment, so perpendicular distance is not viable. 
    return bv.modulus() ;   // Use distance to end of the segment instead. 

    return (ab.cross(av)).modulus()/ab.modulus() ;  // Perpendicular distance of point to segment. 
} 

sens całości (autonomiczny) R3 3D pakiet algebra: https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb

częścią otwartej biblioteki źródłowej https://sourceforge.net/projects/geokarambola/

Powiązane problemy