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); }
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); }