public static Mesh CreateConvexHull(Mesh mesh) { List <MIConvexHull.DefaultVertex> vertices = new List <DefaultVertex>(); foreach (Vector3 vertex in mesh.vertices) { MIConvexHull.DefaultVertex mi_vertex = new MIConvexHull.DefaultVertex(); mi_vertex.Position = new double[3] { vertex.x, vertex.y, vertex.z }; vertices.Add(mi_vertex); } MIConvexHull.ConvexHull < MIConvexHull.DefaultVertex, MIConvexHull.DefaultConvexFace <MIConvexHull.DefaultVertex> > mi_hull = MIConvexHull.ConvexHull.Create(vertices); List <Vector3> hull_vertices = new List <Vector3>(); foreach (MIConvexHull.DefaultVertex vertex in mi_hull.Points) { hull_vertices.Add(new Vector3((float)vertex.Position[0], (float)vertex.Position[1], (float)vertex.Position[2])); } IList <MIConvexHull.DefaultVertex> mi_hull_vertices = new List <MIConvexHull.DefaultVertex>(mi_hull.Points); List <int> triangles = new List <int>(); foreach (MIConvexHull.DefaultConvexFace <MIConvexHull.DefaultVertex> face in mi_hull.Faces) { triangles.Add(mi_hull_vertices.IndexOf(face.Vertices[0])); triangles.Add(mi_hull_vertices.IndexOf(face.Vertices[1])); triangles.Add(mi_hull_vertices.IndexOf(face.Vertices[2])); } Mesh hull = new Mesh(); hull.vertices = hull_vertices.ToArray(); hull.triangles = triangles.ToArray(); hull.RecalculateNormals(); return(hull); }
/// <summary> /// Creates a convex hull of the input data. /// </summary> /// <typeparam name="TVertex"></typeparam> /// <typeparam name="TFace"></typeparam> /// <param name="data"></param> /// <param name="config">If null, default ConvexHullComputationConfig is used.</param> /// <returns></returns> public static ConvexHull <TVertex, TFace> Create <TVertex, TFace>(IList <TVertex> data, ConvexHullComputationConfig config = null) where TVertex : IVertex where TFace : ConvexFace <TVertex, TFace>, new() { return(ConvexHull <TVertex, TFace> .Create(data, config)); }
/// <summary> /// Creates a convex hull of the input data. /// </summary> /// <typeparam name="TVertex"></typeparam> /// <param name="data"></param> /// <param name="config">If null, default ConvexHullComputationConfig is used.</param> /// <returns></returns> public static ConvexHull <TVertex, DefaultConvexFace <TVertex> > Create <TVertex>(IList <TVertex> data, ConvexHullComputationConfig config = null) where TVertex : IVertex { return(ConvexHull <TVertex, DefaultConvexFace <TVertex> > .Create(data, config)); }
/// <summary> /// Creates a convex hull of the input data. /// </summary> /// <typeparam name="TVertex">The type of the t vertex.</typeparam> /// <param name="data">The data.</param> /// <param name="PlaneDistanceTolerance">The plane distance tolerance (default is 1e-10). If too high, points /// will be missed. If too low, the algorithm may break. Only adjust if you notice problems.</param> /// <returns> /// ConvexHull<TVertex, DefaultConvexFace<TVertex>>. /// </returns> public static ConvexHull <TVertex, DefaultConvexFace <TVertex> > Create <TVertex>(IList <TVertex> data, double PlaneDistanceTolerance = Constants.DefaultPlaneDistanceTolerance) where TVertex : IVertex { return(ConvexHull <TVertex, DefaultConvexFace <TVertex> > .Create(data, PlaneDistanceTolerance)); }