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