2016-11-23 20 views
3

У меня есть эта функция, вычисляющая ближайшее расстояние между двумя бесконечными линиями.Самое близкое расстояние между конечными линиями

public static double GetClosestDistanceBetweenLines(Vector3 line1Point, Vector3 line1Vector, Vector3 line2Point, Vector3 line2Vector) 
    { 
     var u = line1Vector; 
     var v = line2Vector; 
     var w = line1Point- line2Point; 

     var a = Vector3.Dot(u, u);   // always >= 0 
     var b = Vector3.Dot(u, v); 
     var c = Vector3.Dot(v, v);   // always >= 0 
     var d = Vector3.Dot(u, w); 
     var e = Vector3.Dot(v, w); 
     var D = a * c - b * b;  // always >= 0 
     double sc, tc; 

     // compute the line parameters of the two closest points 
     if (D < Epsilon) 
     {   // the lines are almost parallel 
      sc = 0.0; 
      tc = (b > c ? d/b : e/c); // use the largest denominator 
     } 
     else 
     { 
      sc = (b * e - c * d)/D; 
      tc = (a * e - b * d)/D; 
     } 

     // get the difference of the two closest points 
     var dP = w + (sc * u) - (tc * v); // = L1(sc) - L2(tc) 

     return dP.Length; // return the closest distance 
    } 

Однако я хочу рассчитать расстояние между двумя конечными линиями.

public static double GetClosestDistanceBetweenLines(Vector3 line1Point1, Vector3 line1Point2, Vector3 line2Point1, Vector3 line2Point2) 

Как это сделать?

+0

Помогло ли это? http://stackoverflow.com/a/627578/106159 –

ответ

3

У вас есть два параметра sc и tc.

Если оба находятся в диапазоне 0..1, то самые близкие точки расстояния лежат внутри сегментов, и расстояние действительно.

Если параметр для одного сегмента выходит за пределы этого диапазона, вычислите расстояние от другого сегмента до соответствующего конца этого сегмента. Например, если sc < 0, используйте sc = 0.

Если оба параметра находятся за пределами допустимого диапазона, найдите наименьшее расстояние для комбинаций конца сегмента