public static List <List <int> > floodSplit2D(ref VolumeticMesh2D mesh) { var unassignedNodes = new List <int>(); for (int i = 0; i < mesh.nodes.Count; ++i) { unassignedNodes.Add(i); } var fragmentCount = 0; var nodes = new List <List <int> >(); int ccc0 = 0; while (unassignedNodes.Count != 0) { if (ccc0++ > 100) { Debug.Log("Too many loops"); break; } Debug.Log(unassignedNodes.Count); var newFragmentId = fragmentCount; fragmentCount++; List <int> queue = new List <int>(); queue.Add(unassignedNodes[0]); unassignedNodes.RemoveAt(0); int targetNode = queue[0]; int ccc1 = 0; while (queue.Count != 0) { if (ccc1++ > 100) { Debug.Log("Too many loops"); break; } if (nodes.Count <= newFragmentId) { nodes.Add(new List <int>()); } nodes[newFragmentId].Add(targetNode); int ccc2 = 0; foreach (var ne in mesh.getNeighbors(targetNode)) { if (ccc2++ > 100) { Debug.Log("Too many loops"); break; } if (!queue.Contains(ne) && unassignedNodes.Contains(ne)) { Edge edge = new Edge(ne, targetNode); if (!mesh.isDamagedEdge(edge)) { queue.Add(ne); unassignedNodes.Remove(ne); } } } queue.RemoveAt(0); } } return(nodes); }
public VolumeticMesh2D generateMesh() { var mesh = new VolumeticMesh2D(); Mesh rawMesh = GetComponent <MeshFilter>().mesh; var vertices = rawMesh.vertices; foreach (var vertex in vertices) { mesh.nodes.Add(new Vector2(vertex.x, vertex.y)); } var calculator = new GK.DelaunayCalculator(); var result = calculator.CalculateTriangulation(mesh.nodes); var triangles = result.Triangles; for (int i = 0; i < triangles.Count; i += 3) { var edgeA = new Edge2D(triangles[i], triangles[i + 2]); var edgeB = new Edge2D(triangles[i + 2], triangles[i + 1]); var edgeC = new Edge2D(triangles[i + 1], triangles[i]); int edgeIndexA, edgeIndexB, edgeIndexC; if (!mesh.edges.Contains(edgeA)) { mesh.edges.Add(edgeA); edgeIndexA = mesh.edges.Count - 1; } else { edgeIndexA = mesh.edges.FindIndex(edge => edge == edgeA); } if (!mesh.edges.Contains(edgeB)) { mesh.edges.Add(edgeB); edgeIndexB = mesh.edges.Count - 1; } else { edgeIndexB = mesh.edges.FindIndex(edge => edge == edgeB); } if (!mesh.edges.Contains(edgeC)) { mesh.edges.Add(edgeC); edgeIndexC = mesh.edges.Count - 1; } else { edgeIndexC = mesh.edges.FindIndex(edge => edge == edgeC); } mesh.nodeJointIndexes.Add(new TriangleNodes2D(triangles[i], triangles[i + 2], triangles[i + 1])); mesh.edgeJointIndexes.Add(new TriangleEdges2D(edgeIndexA, edgeIndexB, edgeIndexC)); } return(mesh); }