예제 #1
0
        public List <TriangleEdge> GetBorder()
        {
            List <TriangleEdge> border = new List <TriangleEdge>();

            foreach (Triangle t in triangles)
            {
                for (int i = 0; i < 3; i++)
                {
                    TriangleEdge e = new TriangleEdge(t.GetVertexIndex(i), t.GetVertexIndex((i + 1) % 3));
                    if (!border.Contains(e))
                    {
                        border.Add(e);
                    }
                    else
                    {
                        border.Remove(e);
                    }
                }
            }
            Console.WriteLine("Mesh border: " + border.Count + " edges.");

            // Sort
            List <TriangleEdge> sortedBorder = new List <TriangleEdge>();

            while (border.Count > 0)
            {
                TriangleEdge start = border[0];
                sortedBorder.Add(start);
                border.Remove(start);

                int  endIdx         = start.B;
                bool found          = true;
                int  borderPolySize = 1;
                while (found)
                {
                    found = false;
                    for (int i = 0; i < border.Count; i++)
                    {
                        TriangleEdge e = border[i];
                        if (e.A == endIdx)
                        {
                            sortedBorder.Add(e);
                            border.Remove(e);
                            endIdx = e.B;
                            found  = true;
                            borderPolySize++;
                        }
                        else if (e.B == endIdx)
                        {
                            sortedBorder.Add(e);
                            border.Remove(e);
                            e.Flip();
                            endIdx = e.A;
                            found  = true;
                            borderPolySize++;
                        }
                    }
                }

                Console.WriteLine("Border polygon found: " + ((start.A == sortedBorder[sortedBorder.Count - 1].B) ? "closed" : "open") + ", " + borderPolySize + " edges");
            }
            return(sortedBorder);
        }