XYZ ProjectPointOntoPlane(
XYZ point,
XYZ planeNormal)
{
double a = planeNormal.X;
double b = planeNormal.Y;
double c = planeNormal.Z;
double dx = ( b * b + c * c ) * point.X - ( a * b ) * point.Y - ( a * c ) * point.Z;
double dy = -( b * a ) * point.X + ( a * a + c * c ) * point.Y - ( b * c ) * point.Z;
double dz = -( c * a ) * point.X - ( c * b ) * point.Y + ( a * a + b * b ) * point.Z;
return new XYZ( dx, dy, dz );
}