public Plane3D(LineDescription3D l1, LineDescription3D l2)
        {
            Point3D ptLinesCross = LineDescription3D.CrossPoint(l1, l2);

            if (ptLinesCross.IsNull)
            {
                return;
            }
            else
            {
                p0             = ptLinesCross;
                n              = l1.directionVector.VectorProduct(l2.directionVector);
                n.VectorLength = 1.0d;
            }
        }
        public static Point3D CrossPoint(LineDescription3D l1, LineDescription3D l2)
        {
            DenseMatrix dmFactorsA = DenseMatrix.Create(2, 2, (r, c) =>
            {
                if (r == 0) // x row
                {
                    switch (c)
                    {
                    case 0:
                        return(l1.directionVector.X);

                        break;

                    case 1:
                        return(-l2.directionVector.X);

                        break;

                    default:
                        break;
                    }
                }
                if (r == 1) // y row
                {
                    switch (c)
                    {
                    case 0:
                        return(l1.directionVector.Y);

                        break;

                    case 1:
                        return(-l2.directionVector.Y);

                        break;

                    default:
                        break;
                    }
                }
                return(0.0d);
            });


            DenseVector dvFactorB = DenseVector.Create(2, r =>
            {
                switch (r)
                {
                case 0:     // x row
                    return(l2.p0.X - l1.p0.X);

                    break;

                case 1:     // y row
                    return(l2.p0.Y - l1.p0.Y);

                    break;

                default:
                    break;
                }
                return(0.0d);
            });

            DenseVector dvKvaluesResult = (DenseVector)dmFactorsA.LU().Solve(dvFactorB);
            Point3D     cross1          = l1.p0 + dvKvaluesResult[0] * l1.directionVector;
            Point3D     cross2          = l2.p0 + dvKvaluesResult[1] * l2.directionVector;

            if (cross1 == cross2)
            {
                return(cross1);
            }
            else
            {
                return(Point3D.nullPoint3D());
            }
        }