/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.spatial.quadtree.mxcifrowindex; import com.espertech.esper.spatial.quadtree.core.BoundingBox; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTree; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeNode; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeNodeBranch; import com.espertech.esper.spatial.quadtree.mxcif.MXCIFQuadTreeNodeLeaf; import java.util.ArrayDeque; import java.util.Collection; public class MXCIFQuadTreeRowIndexQuery { public static Collection<Object> queryRange(MXCIFQuadTree<Object> quadTree, double x, double y, double width, double height) { return queryNode(quadTree.getRoot(), x, y, width, height, null); } private static Collection<Object> queryNode(MXCIFQuadTreeNode<Object> node, double x, double y, double width, double height, Collection<Object> result) { if (node instanceof MXCIFQuadTreeNodeLeaf) { MXCIFQuadTreeNodeLeaf<Object> leaf = (MXCIFQuadTreeNodeLeaf<Object>) node; return visit(leaf, x, y, width, height, result); } MXCIFQuadTreeNodeBranch<Object> branch = (MXCIFQuadTreeNodeBranch<Object>) node; result = visit(branch, x, y, width, height, result); result = queryNode(branch.getNw(), x, y, width, height, result); result = queryNode(branch.getNe(), x, y, width, height, result); result = queryNode(branch.getSw(), x, y, width, height, result); result = queryNode(branch.getSe(), x, y, width, height, result); return result; } private static Collection<Object> visit(MXCIFQuadTreeNode<Object> node, double x, double y, double width, double height, Collection<Object> result) { Object data = node.getData(); if (data == null) { return result; } if (data instanceof XYWHRectangleMultiType) { XYWHRectangleMultiType point = (XYWHRectangleMultiType) data; return visit(point, x, y, width, height, result); } Collection<XYWHRectangleMultiType> collection = (Collection<XYWHRectangleMultiType>) data; for (XYWHRectangleMultiType rectangle : collection) { result = visit(rectangle, x, y, width, height, result); } return result; } private static Collection<Object> visit(XYWHRectangleMultiType rectangle, double x, double y, double width, double height, Collection<Object> result) { if (!BoundingBox.intersectsBoxIncludingEnd(x, y, x + width, y + height, rectangle.getX(), rectangle.getY(), rectangle.getW(), rectangle.getH())) { return result; } if (result == null) { result = new ArrayDeque<>(4); } rectangle.collectInto(result); return result; } }