Example #1
0
        private void getBigLoops()
        {
            List<Node> _nodes = nodes.GetRange(0, nodes.Count);
            _nodes.Sort(sortY);

            while (_nodes.Count > 0)
            {
                Node currentNode = _nodes[0];
                _nodes.RemoveAt(0);
                if (currentNode.nodes.Count < 2) continue;

                BigLoop bigLoop = new BigLoop();
                bigLoop.triangulator = this;

                Node nextNode = currentNode.getMinimalAgleNode(Vector2.up);
                _nodes.Remove(nextNode);
                Node before = currentNode;
                bigLoop.edgeNodes.Add(nextNode);
                bigLoop.allNodes.Add(nextNode);
                nextNode.isBigLoop = true;
                bool right = false; 
                int k = 0;
                while (k < 100000)
                {
                    k++;
                    Node newNext = nextNode.getMinimalAgleNode(before);
                    before = nextNode;
                    nextNode = newNext;
                    if (newNext != null)
                    {
                        _nodes.Remove(newNext);
                        bigLoop.edgeNodes.Add(nextNode);
                        bigLoop.allNodes.Add(nextNode);
                        nextNode.isBigLoop = true;
                    }
                    else
                    {
                        break;
                    }
                    if (nextNode == currentNode)
                    {
                        //Debug.Log("loop");
                        //bigLoop.debug();
                        right = true;
                        break;
                    }

                }
                if (right)
                {
                    List<Node> removeList = new List<Node>();
                    foreach (Node n in _nodes)
                    {
                        if (bigLoop.isBelong(n))
                        {
                            removeList.Add(n);
                            bigLoop.insideNodes.Add(n);
                            bigLoop.allNodes.Add(n);
                        }
                    }
                    foreach (Node n in removeList)
                    {
                        _nodes.Remove(n);
                    }
                   // Debug.Log("Count edgs " + bigLoop.edgeNodes.Count);
                   // Debug.Log("Count ins " + bigLoop.insideNodes.Count);
                   // Debug.Log("Count all " + bigLoop.allNodes.Count);
                    bigLoops.Add(bigLoop);
                    
                }
            }
        }
Example #2
0
        private void getBigLoops()
        {
            List <Node> _nodes = nodes.GetRange(0, nodes.Count);

            _nodes.Sort(sortY);

            while (_nodes.Count > 0)
            {
                Node currentNode = _nodes[0];
                _nodes.RemoveAt(0);
                if (currentNode.nodes.Count < 2)
                {
                    continue;
                }

                BigLoop bigLoop = new BigLoop();
                bigLoop.triangulator = this;

                Node nextNode = currentNode.getMinimalAgleNode(Vector2.up);
                _nodes.Remove(nextNode);
                Node before = currentNode;
                bigLoop.edgeNodes.Add(nextNode);
                bigLoop.allNodes.Add(nextNode);
                nextNode.isBigLoop = true;
                bool right = false;
                int  k     = 0;
                while (k < 100000)
                {
                    k++;
                    Node newNext = nextNode.getMinimalAgleNode(before);
                    before   = nextNode;
                    nextNode = newNext;
                    if (newNext != null)
                    {
                        _nodes.Remove(newNext);
                        bigLoop.edgeNodes.Add(nextNode);
                        bigLoop.allNodes.Add(nextNode);
                        nextNode.isBigLoop = true;
                    }
                    else
                    {
                        break;
                    }
                    if (nextNode == currentNode)
                    {
                        //Debug.Log("loop");
                        //bigLoop.debug();
                        right = true;
                        break;
                    }
                }
                if (right)
                {
                    List <Node> removeList = new List <Node>();
                    foreach (Node n in _nodes)
                    {
                        if (bigLoop.isBelong(n))
                        {
                            removeList.Add(n);
                            bigLoop.insideNodes.Add(n);
                            bigLoop.allNodes.Add(n);
                        }
                    }
                    foreach (Node n in removeList)
                    {
                        _nodes.Remove(n);
                    }
                    // Debug.Log("Count edgs " + bigLoop.edgeNodes.Count);
                    // Debug.Log("Count ins " + bigLoop.insideNodes.Count);
                    // Debug.Log("Count all " + bigLoop.allNodes.Count);
                    bigLoops.Add(bigLoop);
                }
            }
        }