public static Matrix3D ProjectOnPlane(Matrix3D projectToWorld, Plane3D plane)
        {
            var matrix3D = projectToWorld;
            var num1     = plane.A * matrix3D.M11 + plane.B * matrix3D.M12 + plane.C * matrix3D.M13 - plane.D * matrix3D.M14;
            var num2     = plane.A * matrix3D.M21 + plane.B * matrix3D.M22 + plane.C * matrix3D.M23 - plane.D * matrix3D.M24;
            var num3     = plane.A * matrix3D.M31 + plane.B * matrix3D.M32 + plane.C * matrix3D.M33 - plane.D * matrix3D.M34;
            var num4     = plane.A * matrix3D.OffsetX + plane.B * matrix3D.OffsetY + plane.C * matrix3D.OffsetZ - plane.D * matrix3D.M44;

            if (num3 == 0.0)
            {
                throw new InvalidOperationException();
            }
            var num5 = -1.0 / num3;

            return(new Matrix3D(1.0, 0.0, num1 * num5, 0.0, 0.0, 1.0, num2 * num5, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, num4 * num5, 1.0) * projectToWorld);
        }
        public static Point3D IntersectLineToPlane(
            Point3D linePoint1,
            Point3D linePoint2,
            Plane3D plane)
        {
            var point = Subtract(linePoint2, linePoint1);
            var num1  = plane.D - plane.A * linePoint1.X - plane.B * linePoint1.Y - plane.C * linePoint1.Z;
            var num2  = plane.A * point.X + plane.B * point.Y + plane.C * point.Z;

            if (num2 == 0.0)
            {
                throw new InvalidOperationException();
            }
            var scalar = num1 / num2;

            return(Add(linePoint1, Multiply(point, scalar)));
        }