private static Point3D[] GetIntersection_Hull_Plane(ITriangleIndexed[] hull, ITriangle plane)
            {
                // Shoot through all the triangles in the hull, and get line segment intersections
                List<Tuple<Point3D, Point3D>> lineSegments = null;

                if (hull.Length > 100)
                {
                    lineSegments = hull.
                        AsParallel().
                        Select(o => GetIntersection_Plane_Triangle(plane, o)).
                        Where(o => o != null).
                        ToList();
                }
                else
                {
                    lineSegments = hull.
                        Select(o => GetIntersection_Plane_Triangle(plane, o)).
                        Where(o => o != null).
                        ToList();
                }

                if (lineSegments.Count < 2)
                {
                    // length of 0 is a clear miss, 1 is just touching
                    //NOTE: All the points could be colinear, and just touching the hull, but deeper analysis is needed
                    return null;
                }

                // Stitch the line segments together
                Point3D[] retVal = GetIntersection_Hull_PlaneSprtStitchSegments(lineSegments);

                if (retVal == null)
                {
                    // In some cases, the above method fails, so call the more generic 2D convex hull method
                    //NOTE: This assumes the hull is convex
                    retVal = GetIntersection_Hull_PlaneSprtConvexHull(lineSegments);
                }

                // Exit Function
                return retVal;      // could still be null
            }