public static Vector3[] ExtractEdgeVertices(Vector3[] vertices, int[] triangles) { var verticesLength = vertices.Length; var trianglesCount = triangles.Length / 3; var edges = new List <EdgeV2>(); var innerEdges = new List <EdgeV2>(); for (var i = 0; i < trianglesCount; i++) { int a = triangles[i * 3]; int b = triangles[i * 3 + 1]; int c = triangles[i * 3 + 2]; var edgeAB = new EdgeV2(a, b); var edgeBC = new EdgeV2(b, c); var edgeCA = new EdgeV2(c, a); AddEdgeOrMoveToInnerEdges(edgeAB, edges, innerEdges); AddEdgeOrMoveToInnerEdges(edgeBC, edges, innerEdges); AddEdgeOrMoveToInnerEdges(edgeCA, edges, innerEdges); } var currentEdge = edges[0]; var valueOfStart = currentEdge.a; var currentEndValue = currentEdge.b; var indexOfEdgeStart = new List <int>(); indexOfEdgeStart.Add(valueOfStart); indexOfEdgeStart.Add(currentEndValue); int count = 1; while (count < edges.Count) { currentEdge = edges.Find(e => (e.a == currentEndValue || e.b == currentEndValue) && (e.a != valueOfStart && e.b != valueOfStart)); valueOfStart = currentEndValue; currentEndValue = currentEdge.a == valueOfStart ? currentEdge.b : currentEdge.a; indexOfEdgeStart.Add(currentEndValue); count++; } Vector3[] outputVertices = new Vector3[indexOfEdgeStart.Count]; for (var i = 0; i < outputVertices.Length; i++) { outputVertices[i] = vertices[indexOfEdgeStart[i]]; } return(outputVertices); }
static void AddEdgeOrMoveToInnerEdges(EdgeV2 edge, List <EdgeV2> edges, List <EdgeV2> innerEdges) { if (!innerEdges.Contains(edge)) { if (edges.Contains(edge)) { innerEdges.Add(edge); edges.Remove(edge); } else { edges.Add(edge); } } }