Esempio n. 1
0
        /// <summary>
        /// Triangulate cell with the provided vertices.
        /// </summary>
        /// <param name="vertices">The vertices of the cell.</param>
        /// <returns>The triangulation.</returns>
        private IEnumerable <DefaultTriangulationCell <MIVertex> > Triangulate(List <Vector3D> vertices)
        {
            IEnumerable <DefaultTriangulationCell <MIVertex> > triangles = null;

            // Convert vertices to objects that work with MIConvexHull library
            MIVertex[] miVertices = new MIVertex[vertices.Count];
            for (int i = 0; i < vertices.Count; i++)
            {
                miVertices[i] = new MIVertex(vertices[i].X, vertices[i].Y, vertices[i].Z);
            }

            if (vertices.Count == 4)
            {
                // MIConvexHull library cannot create a triangulation from a single tetrahedron
                triangles = new List <DefaultTriangulationCell <MIVertex> >()
                {
                    new DefaultTriangulationCell <MIVertex>()
                    {
                        Vertices = miVertices
                    }
                };
            }
            else
            {
                // More vertices are OK so let the library to triangulate them
                var triangulation = Triangulation.CreateDelaunay(miVertices);
                triangles = triangulation.Cells;
            }

            return(triangles);
        }
Esempio n. 2
0
    protected override int[] FindTriangles()
    {
        var triangles = new List <int> ();
        //Convert vertices to MIVertices
        var miVertices = new List <MIVertex> ();

        for (int i = 0; i < _vertices.Length; ++i)
        {
            var miVertex = new MIVertex();
            var vertex   = _vertices [i];
            miVertex.Index    = i;
            miVertex.Position = new double[3] {
                vertex.x, vertex.y, vertex.z
            };
            miVertices.Add(miVertex);
        }
        //Generate convex hull + extract triangles
        var hull = ConvexHull.Create(miVertices);

        foreach (var face in hull.Faces)
        {
            foreach (var vertex in face.Vertices)
            {
                triangles.Add(vertex.Index);
            }
        }
        return(triangles.ToArray());
    }
        /// <summary>
        /// Triangulate cell with the provided vertices.
        /// </summary>
        /// <param name="vertices">The vertices of the cell.</param>
        /// <returns>The triangulation.</returns>
        private IEnumerable <DefaultTriangulationCell <MIVertex> > Triangulate(List <Vector2D> vertices)
        {
            if (vertices.Count == 3)
            {
                // Convert vertices to objects that work with MIConvexHull library
                MIVertex[] miVertices = new MIVertex[vertices.Count];
                for (int i = 0; i < vertices.Count; i++)
                {
                    miVertices[i] = new MIVertex(vertices[i].X, vertices[i].Y);
                }

                // MIConvexHull library cannot create a triangulation from a single triangle
                return(new List <DefaultTriangulationCell <MIVertex> >()
                {
                    new DefaultTriangulationCell <MIVertex>()
                    {
                        Vertices = miVertices
                    }
                });
            }
            else if (vertices.Count == 4)
            {
                // There are problems with 4 vertices in MIConvexHull algorithms. There are multiple issues on their github

                Vector2D average = new Vector2D();

                for (int i = 0; i < vertices.Count; i++)
                {
                    average.X += vertices[i].X;
                    average.Y += vertices[i].Y;
                }

                average.X /= vertices.Count;
                average.Y /= vertices.Count;

                // Convert vertices to objects that work with MIConvexHull library
                List <MIVertex> miVertices = new List <MIVertex>(vertices.Count);
                for (int i = 0; i < vertices.Count; i++)
                {
                    miVertices.Add(new MIVertex(vertices[i].X, vertices[i].Y));
                }

                miVertices.Sort(Comparer <MIVertex> .Create((item1, item2) => {
                    var position1 = item1.Position;
                    var position2 = item2.Position;

                    double a1 = ((Math.Atan2(position1[0] - average.X, position1[1] - average.Y) * 180 / Math.PI) + 360) % 360;
                    double a2 = ((Math.Atan2(position2[0] - average.X, position2[1] - average.Y) * 180 / Math.PI) + 360) % 360;
                    return((int)(a1 - a2));
                }));

                var triangles = new List <DefaultTriangulationCell <MIVertex> >();

                for (int i = 1; i < miVertices.Count - 1; i++)
                {
                    MIVertex[] tempVertices = { miVertices[0], miVertices[i], miVertices[i + 1] };
                    triangles.Add(new DefaultTriangulationCell <MIVertex>()
                    {
                        Vertices = tempVertices
                    });
                }

                return(triangles);
            }
            else
            {
                // Convert vertices to objects that work with MIConvexHull library
                MIVertex[] miVertices = new MIVertex[vertices.Count];
                for (int i = 0; i < vertices.Count; i++)
                {
                    miVertices[i] = new MIVertex(vertices[i].X, vertices[i].Y);
                }

                // More vertices are OK so let the library to triangulate them
                var triangulation = Triangulation.CreateDelaunay(miVertices);
                return(triangulation.Cells);
            }
        }