2016-11-23 1 views
3

J'ai cette fonction pour calculer la distance la plus proche entre deux lignes infinies.Distance la plus proche entre les lignes finies

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 
    } 

Cependant, je veux calculer la distance entre deux lignes finies.

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

Comment procéder?

+0

Est-ce que cela aide? http://stackoverflow.com/a/627578/106159 –

Répondre

3

Vous avez deux paramètres sc et tc.

Si les deux se trouvent dans la plage 0..1, les points de distance les plus proches se trouvent à l'intérieur des segments et la distance est valide.

Si le paramètre d'un segment est en dehors de cette plage, calculez la distance d'un autre segment à l'extrémité appropriée de ce segment. Par exemple, si sc < 0, utilisez sc = 0.

Si les deux paramètres sont en dehors des limites, trouvez la plus petite distance pour les combinaisons de fin de segment