main/src/georegression/metric/ClosestPoint3D_F64.java
public static boolean closestPoints(LineParametric3D_F64 l0,
										LineParametric3D_F64 l1,
										double param[])
	{
		double dX = l0.p.x - l1.p.x;
		double dY = l0.p.y - l1.p.y;
		double dZ = l0.p.z - l1.p.z;

		// this solution is from: http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/
		double dv01v1 = MiscOps.dot( dX , dY , dZ, l1.slope );
		double dv1v0 = MiscOps.dot( l1.slope, l0.slope );
		double dv1v1 = MiscOps.dot( l1.slope, l1.slope );

		double t0 = dv01v1 * dv1v0 - MiscOps.dot( dX , dY , dZ, l0.slope ) * dv1v1;
		double bottom = MiscOps.dot( l0.slope, l0.slope ) * dv1v1 - dv1v0 * dv1v0;
		if( bottom == 0 )
			return false;

		t0 /= bottom;

		// ( d1343 + mua d4321 ) / d4343
		double t1 = ( dv01v1 + t0 * dv1v0 ) / dv1v1;

		param[0] = t0;
		param[1] = t1;

		return true;
	}
public static boolean closestPoints(LineParametric3D_F64 l0,
										LineParametric3D_F64 l1,
										double param[])
	{
		double dX = l0.p.x - l1.p.x;
		double dY = l0.p.y - l1.p.y;
		double dZ = l0.p.z - l1.p.z;

		// this solution is from: http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/
		double dv01v1 = MiscOps.dot( dX , dY , dZ, l1.slope );
		double dv1v0 = MiscOps.dot( l1.slope, l0.slope );
		double dv1v1 = MiscOps.dot( l1.slope, l1.slope );

		double t0 = dv01v1 * dv1v0 - MiscOps.dot( dX , dY , dZ, l0.slope ) * dv1v1;
		double bottom = MiscOps.dot( l0.slope, l0.slope ) * dv1v1 - dv1v0 * dv1v0;
		if( bottom == 0 )
			return false;

		t0 /= bottom;

		// ( d1343 + mua d4321 ) / d4343
		double t1 = ( dv01v1 + t0 * dv1v0 ) / dv1v1;

		param[0] = t0;
		param[1] = t1;

		return true;
	}
public static boolean closestPoints ( LineParametric3D_F64 l0 , LineParametric3D_F64 l1 , double param [ ] ) { double dX = l0 . p . x - l1 . p . x ; double dY = l0 . p . y - l1 . p . y ; double dZ = l0 . p . z - l1 . p . z ; // this solution is from: http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/ double dv01v1 = MiscOps . dot ( dX , dY , dZ , l1 . slope ) ; double dv1v0 = MiscOps . dot ( l1 . slope , l0 . slope ) ; double dv1v1 = MiscOps . dot ( l1 . slope , l1 . slope ) ; double t0 = dv01v1 * dv1v0 - MiscOps . dot ( dX , dY , dZ , l0 . slope ) * dv1v1 ; double bottom = MiscOps . dot ( l0 . slope , l0 . slope ) * dv1v1 - dv1v0 * dv1v0 ; if ( bottom == 0 ) return false ; t0 /= bottom ; // ( d1343 + mua d4321 ) / d4343 double t1 = ( dv01v1 + t0 * dv1v0 ) / dv1v1 ; param [ 0 ] = t0 ; param [ 1 ] = t1 ; return true ; }
<p>
Finds the closest point on line lo to l1 and on l1 to l0.  The solution is returned in
'param' as a value of 't' for each line.
</p>
<p>
point on l0 = l0.a + param[0]*l0.slope<br>
point on l1 = l1.a + param[1]*l1.slope
</p>
@param l0  first line. Not modified.
@param l1  second line. Not modified.
@param param  param[0] for line0 location and param[1] for line1 location.

@return False if the lines are parallel or true if a solution was found.
<p > Finds the closest point on line lo to l1 and on l1 to l0 . The solution is returned in param as a value of t for each line . < / p > <p > point on l0 = l0 . a + param [ 0 ] * l0 . slope<br > point on l1 = l1 . a + param [ 1 ] * l1 . slope < / p > @param l0 first line . Not modified . @param l1 second line . Not modified . @param param param [ 0 ] for line0 location and param [ 1 ] for line1 location .