```/*
Line3D.cpp
Written by Matthew Fisher

A standard 3D line.
*/

bool Line3D::ClosestPoint(const Line3D &L1, const Line3D &L2, Vec3f &Result1, Vec3f &Result2)
{
Vec3f NewDir = Vec3f::Cross(L1.D, L2.D);
float Length = NewDir.Length();
if(Length == 0.0f)
{
return false;
}

Plane P1 = Plane::ConstructFromPointVectors(L1.P0, NewDir, L1.D);
Plane P2 = Plane::ConstructFromPointVectors(L2.P0, NewDir, L2.D);

Result1 = P2.IntersectLine(L1);
Result2 = P1.IntersectLine(L2);

return true;
}

float Line3D::Dist(const Line3D &L1, const Line3D &L2)
{
Vec3f Cross = Vec3f::Cross(L1.D, L2.D);
return Math::Abs(Vec3f::Dot(L2.P0 - L1.P0, Cross)) / Cross.Length();
}

float Line3D::DistSq(const Line3D &L1, const Line3D &L2)
{
Vec3f Cross = Vec3f::Cross(L1.D, L2.D);
float Dot = Vec3f::Dot(L2.P0 - L1.P0, Cross);
return (Dot * Dot) / Cross.LengthSq();
}

float Line3D::DistToPoint(const Vec3f &P) const
{
float t0 = Vec3f::Dot(D, P - P0) / Vec3f::Dot(D, D);
float distanceLine = Vec3f::Dist(P, P0 + t0 * D);
return distanceLine;
}
```