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); }