Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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);
         }
     }
 }