private static MXCIFQuadTreeNode Subdivide( MXCIFQuadTreeNodeLeaf leaf, MXCIFQuadTree tree) { var w = (leaf.Bb.MaxX - leaf.Bb.MinX) / 2d; var h = (leaf.Bb.MaxY - leaf.Bb.MinY) / 2d; var minx = leaf.Bb.MinX; var miny = leaf.Bb.MinY; var bbNW = new BoundingBox(minx, miny, minx + w, miny + h); var bbNE = new BoundingBox(minx + w, miny, leaf.Bb.MaxX, miny + h); var bbSW = new BoundingBox(minx, miny + h, minx + w, leaf.Bb.MaxY); var bbSE = new BoundingBox(minx + w, miny + h, leaf.Bb.MaxX, leaf.Bb.MaxY); var nw = new MXCIFQuadTreeNodeLeaf(bbNW, leaf.Level + 1, null, 0); var ne = new MXCIFQuadTreeNodeLeaf(bbNE, leaf.Level + 1, null, 0); var sw = new MXCIFQuadTreeNodeLeaf(bbSW, leaf.Level + 1, null, 0); var se = new MXCIFQuadTreeNodeLeaf(bbSE, leaf.Level + 1, null, 0); var branch = new MXCIFQuadTreeNodeBranch(leaf.Bb, leaf.Level, null, 0, nw, ne, sw, se); var rectangles = leaf.Data; if (rectangles is XYWHRectangleWValue asRectangle) { Subdivide(asRectangle, branch, tree); } else { var collection = (ICollection<XYWHRectangleWValue>) rectangles; foreach (var rectangle in collection) { Subdivide(rectangle, branch, tree); } } return branch; }
private static MXCIFQuadTreeNode Subdivide( MXCIFQuadTreeNodeLeaf leaf, MXCIFQuadTree tree, bool unique, string indexName) { var w = (leaf.Bb.MaxX - leaf.Bb.MinX) / 2d; var h = (leaf.Bb.MaxY - leaf.Bb.MinY) / 2d; var minx = leaf.Bb.MinX; var miny = leaf.Bb.MinY; var bbNW = new BoundingBox(minx, miny, minx + w, miny + h); var bbNE = new BoundingBox(minx + w, miny, leaf.Bb.MaxX, miny + h); var bbSW = new BoundingBox(minx, miny + h, minx + w, leaf.Bb.MaxY); var bbSE = new BoundingBox(minx + w, miny + h, leaf.Bb.MaxX, leaf.Bb.MaxY); MXCIFQuadTreeNode nw = new MXCIFQuadTreeNodeLeaf(bbNW, leaf.Level + 1, null, 0); MXCIFQuadTreeNode ne = new MXCIFQuadTreeNodeLeaf(bbNE, leaf.Level + 1, null, 0); MXCIFQuadTreeNode sw = new MXCIFQuadTreeNodeLeaf(bbSW, leaf.Level + 1, null, 0); MXCIFQuadTreeNode se = new MXCIFQuadTreeNodeLeaf(bbSE, leaf.Level + 1, null, 0); var branch = new MXCIFQuadTreeNodeBranch(leaf.Bb, leaf.Level, null, 0, nw, ne, sw, se); var data = leaf.Data; if (data is XYWHRectangleMultiType) { var rectangle = (XYWHRectangleMultiType) data; Subdivide(rectangle, branch, tree, unique, indexName); } else { var collection = (ICollection<XYWHRectangleMultiType>) data; foreach (var rectangle in collection) { Subdivide(rectangle, branch, tree, unique, indexName); } } return branch; }
public static void Traverse( MXCIFQuadTreeNode node, Consumer<object> consumer) { if (node is MXCIFQuadTreeNodeLeaf) { MXCIFQuadTreeNodeLeaf leaf = (MXCIFQuadTreeNodeLeaf) node; TraverseData(leaf.Data, consumer); return; } MXCIFQuadTreeNodeBranch branch = (MXCIFQuadTreeNodeBranch) node; TraverseData(branch.Data, consumer); Traverse(branch.Nw, consumer); Traverse(branch.Ne, consumer); Traverse(branch.Sw, consumer); Traverse(branch.Se, consumer); }