Пример #1
0
        public QuadtreeNode GetChildNode(QuadtreeNodeTypes type, bool forceCreate = false)
        {
            if (forceCreate)
            {
                CheckNodes(type);
            }
            switch (type)
            {
            case QuadtreeNodeTypes.NW:
                return(NW);

            case QuadtreeNodeTypes.NE:
                return(NE);

            case QuadtreeNodeTypes.SW:
                return(SW);

            case QuadtreeNodeTypes.SE:
                return(SE);

            case QuadtreeNodeTypes.Self:
            default:
                return(this);
            }
        }
Пример #2
0
        public void VisitNodes(Tuple <Range, Range> visibleRange, double zoomLevel, Action <SimpleNode> callback)
        {
            QuadtreeNode         currentNode = this;
            int                  watchdog    = MaxIterations;
            Stack <QuadtreeNode> nodes       = new Stack <QuadtreeNode>();

            do
            {
                QuadtreeNodeTypes orientationMin = currentNode.CalculateOrientation(visibleRange.Item1.Min, visibleRange.Item2.Min);
                QuadtreeNodeTypes orientationMax = currentNode.CalculateOrientation(visibleRange.Item1.Max, visibleRange.Item2.Max);
                foreach (QuadtreeNodeTypes nodeType in Enum.GetValues(typeof(QuadtreeNodeTypes)))
                {
                    QuadtreeNode node = currentNode.GetChildNode(nodeType);
                    if (node == null || node.IsEmpty)
                    {
                        continue;
                    }
                    if (node.ZoomLevel < zoomLevel)
                    {
                        continue;
                    }
                    if (node == currentNode)
                    {
                        callback(node);
                        continue;
                    }
                    if (orientationMax == orientationMin && orientationMin != nodeType)
                    {
                        continue;
                    }
                    if (orientationMin == QuadtreeNodeTypes.SW && orientationMax == QuadtreeNodeTypes.SE && (nodeType == QuadtreeNodeTypes.NE || nodeType == QuadtreeNodeTypes.NW))
                    {
                        continue;
                    }
                    if (orientationMin == QuadtreeNodeTypes.SW && orientationMax == QuadtreeNodeTypes.NW && (nodeType == QuadtreeNodeTypes.NE || nodeType == QuadtreeNodeTypes.SE))
                    {
                        continue;
                    }
                    if (orientationMin == QuadtreeNodeTypes.NW && orientationMax == QuadtreeNodeTypes.NE && (nodeType == QuadtreeNodeTypes.SE || nodeType == QuadtreeNodeTypes.SW))
                    {
                        continue;
                    }
                    nodes.Push(node);
                }
                if (nodes.Count == 0)
                {
                    break;
                }
                currentNode = nodes.Pop();
            }while (nodes.Count >= 0 && watchdog-- > 0);
        }
Пример #3
0
 void CheckNodes(QuadtreeNodeTypes hint)
 {
     if (NW == null && hint == QuadtreeNodeTypes.NW)
     {
         NW = new QuadtreeNode();
     }
     if (NE == null && hint == QuadtreeNodeTypes.NE)
     {
         NE = new QuadtreeNode();
     }
     if (SW == null && hint == QuadtreeNodeTypes.SW)
     {
         SW = new QuadtreeNode();
     }
     if (SE == null && hint == QuadtreeNodeTypes.SE)
     {
         SE = new QuadtreeNode();
     }
 }
Пример #4
0
        public static QuadtreeNode GetEdgeNode(QuadtreeNode startNode, QuadtreeNodeTypes corner)
        {
            QuadtreeNode result    = startNode;
            QuadtreeNode newParent = null;
            int          maxDepth  = QuadtreeNode.MaxIterations;

            do
            {
                newParent = result.GetChildNode(corner);
                if (newParent != null)
                {
                    result = newParent;
                }
                if (maxDepth < 1)
                {
                    throw new Exception("too large data");
                }
            }while (newParent != null && maxDepth-- > 0);
            return(result);
        }