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);
    }
示例#2
0
    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);
    }