Find the minimum distance between two lines source code

This snippet submitted by Giacomo on 2010-07-21. It has been viewed 12662 times.
Rating of 4.3 with 78 votes

  

typedef struct line {

    float x0;

    float y0;

    float z0;

    float l;

    float m;

    float n;

} Line;




double distance(Line line1, Line line2) {

    double x01 = line1.x0;

    double x02 = line2.x0;

    double y01 = line1.y0;

    double y02 = line2.y0;

    double z01 = line1.z0;

    double z02 = line2.z0;

    double l1 = line1.l;

    double l2 = line2.l;

    double m1 = line1.m;

    double m2 = line2.m;

    double n1 = line1.n;

    double n2 = line2.n;

    

    double t1 = (-l1*(pow(m2,2) + pow(n2,2))*(x01 - x02) - (m2*n1 - m1*n2)*(n2*(-y01 + y02) + 

      m2*(z01 - z02)) + pow(l2,2)*(m1*(-y01 + y02) + n1*(-z01 + z02)) + 

      l2*(m1*m2*(x01 - x02) + n1*n2*(x01 - x02) + l1*(m2*y01 - m2*y02 + n2*z01 - n2*z02))) / 

      (pow(l2,2)*(pow(m1,2) + pow(n1,2)) + pow(m2*n1 - m1*n2, 2) - 2*l1*l2*(m1*m2 + n1*n2) + pow(l1,2) * (pow(m2,2) + pow(n2,2)));

    double t2 = -((l1*l2 + m1*m2 + n1*n2)*(l1*(x01 - x02) + m1*(y01 - y02) + 

       n1*(z01 - z02)) - (pow(l1,2) + pow(m1,2) + pow(n1,2))*(l2*(x01 - x02) + 

       m2*(y01 - y02) + n2*(z01 - z02))) / 

       (-pow(l1*l2 + m1*m2 + n1*n2, 2) + (pow(l1,2) + pow(m1,2) + pow(n1,2))*(pow(l2,2) + pow(m2,2) + pow(n2,2)));

       

    double p_x = x01 + l1 * t1;

    double p_y = y01 + m1 * t1;

    double p_z = z01 + n1 * t1;

    double q_x = x02 + l2 * t2;

    double q_y = y02 + m2 * t2;

    double q_z = z02 + n2 * t2;

    
    

    double dist = sqrt(pow(p_x - q_x, 2) + pow(p_y - q_y, 2) + pow(p_z - q_z,2));

    

    return dist;

    

}
 




More C and C++ source code snippets