public static int findMaxDepth(Envelope maxBounds, final int absoluteMaxDepth) { // choose the quad that tends to the biggest abs value maxBounds = Node.makePrecise(maxBounds); final Quadrant testQuad = findBiggestMagnitudeQuad(maxBounds); Envelope parent = new Envelope(maxBounds); Envelope child = new Envelope(); Envelope float32Center = new Envelope(); for (int d = 0; d < absoluteMaxDepth; d++) { testQuad.slice(parent, child); Coordinate center = child.centre(); toFloat32(center, float32Center); if (!child.contains(float32Center)) { return d; } parent.init(child); } return absoluteMaxDepth; }
private int findMaxDepth(Envelope e) { return Quadrant.findMaxDepth(e, ABSOLUTE_MAX_DEPTH); }
for (int quadIndex = 0; quadIndex < 4; quadIndex++) { Quadrant quadrant = quadrants[quadIndex]; quadrant.slice(parentQuadrantBounds, qBounds); if (qBounds.contains(nodeBounds)) { unpromotable = false; bucketsByDepth.add(Integer.valueOf(quadrant.getBucketNumber())); parentQuadrantBounds.init(qBounds); break;
@VisibleForTesting Envelope slice(Envelope parent) { Envelope target = new Envelope(); slice(parent, target); return target; }
@Test public void test_level3() { QuadTreeClusteringStrategy quadStrategy = support.newStrategy(); // create quad-sized node for each of the first level (1/16 world) quads for (Quadrant q1 : Quadrant.values()) { for (Quadrant q2 : Quadrant.values()) { for (Quadrant q3 : Quadrant.values()) { Node n = support.createNode("node", q1, q2, q3); NodeId quadID = quadStrategy.computeId(n); // should only be 3 levels deep (too big to go further) assertEquals(3, quadStrategy.quadrantsByDepth(quadID, 8).size()); assertEquals(q1.getBucketNumber(), quadStrategy.bucket(quadID, 0)); assertEquals(q2.getBucketNumber(), quadStrategy.bucket(quadID, 1)); assertEquals(q3.getBucketNumber(), quadStrategy.bucket(quadID, 2)); } } } }
public DAG findDAG(QuadTreeClusteringStrategy quadStrategy, List<Quadrant> key) { List<Integer> bucketNumbers = Lists.transform(key, (q) -> Integer.valueOf(q.getBucketNumber())); String skey = bucketNumbers.toString(); return findDAG(quadStrategy, skey); }
public @Test void findBiggestMagnitudeQuadrantForMaxBounds() { assertEquals(NE, Quadrant.findBiggestMagnitudeQuad(new Envelope(-1, 1, -1, 1))); assertEquals(SW, Quadrant.findBiggestMagnitudeQuad(new Envelope(-10, 0, -10, 0))); assertEquals(NW, Quadrant.findBiggestMagnitudeQuad(new Envelope(-10, 0, 0, 10))); assertEquals(NE, Quadrant.findBiggestMagnitudeQuad(new Envelope(0, 10, 0, 10))); assertEquals(SE, Quadrant.findBiggestMagnitudeQuad(new Envelope(0, 10, -10, 0))); }
public int getBucketNumber() { return this.ordinal(); }
@VisibleForTesting Envelope slice(Envelope parent) { Envelope target = new Envelope(); slice(parent, target); return target; }
@Test public void test_level3() { QuadTreeClusteringStrategy quadStrategy = support.newStrategy(); // create quad-sized node for each of the first level (1/16 world) quads for (Quadrant q1 : Quadrant.values()) { for (Quadrant q2 : Quadrant.values()) { for (Quadrant q3 : Quadrant.values()) { Node n = support.createNode("node", q1, q2, q3); NodeId quadID = quadStrategy.computeId(n); // should only be 3 levels deep (too big to go further) assertEquals(3, quadStrategy.quadrantsByDepth(quadID, 8).size()); assertEquals(q1.getBucketNumber(), quadStrategy.bucket(quadID, 0)); assertEquals(q2.getBucketNumber(), quadStrategy.bucket(quadID, 1)); assertEquals(q3.getBucketNumber(), quadStrategy.bucket(quadID, 2)); } } } }
public DAG findDAG(QuadTreeClusteringStrategy quadStrategy, List<Quadrant> key) { List<Integer> bucketNumbers = Lists.transform(key, (q) -> Integer.valueOf(q.getBucketNumber())); String skey = bucketNumbers.toString(); return findDAG(quadStrategy, skey); }
public @Test void findBiggestMagnitudeQuadrantForMaxBounds() { assertEquals(NE, Quadrant.findBiggestMagnitudeQuad(new Envelope(-1, 1, -1, 1))); assertEquals(SW, Quadrant.findBiggestMagnitudeQuad(new Envelope(-10, 0, -10, 0))); assertEquals(NW, Quadrant.findBiggestMagnitudeQuad(new Envelope(-10, 0, 0, 10))); assertEquals(NE, Quadrant.findBiggestMagnitudeQuad(new Envelope(0, 10, 0, 10))); assertEquals(SE, Quadrant.findBiggestMagnitudeQuad(new Envelope(0, 10, -10, 0))); }
public int getBucketNumber() { return this.ordinal(); }
/** * @return the exact bounds of the leaf quad addressed by the given list of quadrants */ public Envelope quadBounds(Quadrant... quadrants) { Envelope env = getMaxBounds(); for (Quadrant q : quadrants) { env = q.slice(env); } return env; }
@Test public void test_level2() { QuadTreeClusteringStrategy quadStrategy = support.newStrategy(); // create quad-sized node for each of the first level (1/8 world) quads for (Quadrant q1 : Quadrant.values()) { for (Quadrant q2 : Quadrant.values()) { Node n = support.createNode("node", q1, q2); NodeId quadID = quadStrategy.computeId(n); // should only be 2 levels deep (too big to go further) assertEquals(2, quadStrategy.quadrantsByDepth(quadID, 8).size()); assertEquals(q1.getBucketNumber(), quadStrategy.bucket(quadID, 0)); assertEquals(q2.getBucketNumber(), quadStrategy.bucket(quadID, 1)); } } }
public static int findMaxDepth(Envelope maxBounds, final int absoluteMaxDepth) { // choose the quad that tends to the biggest abs value maxBounds = RevObjects.makePrecise(maxBounds); final Quadrant testQuad = findBiggestMagnitudeQuad(maxBounds); Envelope parent = new Envelope(maxBounds); Envelope child = new Envelope(); Envelope float32Center = new Envelope(); for (int d = 0; d < absoluteMaxDepth; d++) { testQuad.slice(parent, child); Coordinate center = child.centre(); toFloat32(center, float32Center); if (!child.contains(float32Center)) { return d; } parent.init(child); } return absoluteMaxDepth; }
for (int quadIndex = 0; quadIndex < 4; quadIndex++) { Quadrant quadrant = quadrants[quadIndex]; quadrant.slice(parentQuadrantBounds, qBounds); if (qBounds.contains(nodeBounds)) { unpromotable = false; bucketsByDepth.add(Integer.valueOf(quadrant.getBucketNumber())); parentQuadrantBounds.init(qBounds); break;
private int findMaxDepth(Envelope e) { return Quadrant.findMaxDepth(e, ABSOLUTE_MAX_DEPTH); }
for (Quadrant q : Quadrant.VALUES) { java.util.Optional<Bucket> treeBucket = originalTree .getBucket(q.getBucketNumber()); if (treeBucket.isPresent()) { Envelope bucketBounds = treeBucket.get().bounds().orNull(); expandsTo = rootId.newChild(quadrant.getBucketNumber());
/** * Returns the bucket index in the range 0-3 corresponding to this node at the specified depth * (i.e. the bucket index represents a quadrant), or {@code -1} if the spatial bounds of this * node don't fit on a single child quadrant and hence the node shall be kept at the current * tree node (hence creating a mixed {@link RevTree} with both direct children and buckets). */ public @Override int bucket(final NodeId nodeId, final int depthIndex) { final Envelope nodeBounds = nodeId.value(); final Quadrant quadrantAtDepth = computeQuadrant(nodeBounds, depthIndex); if (quadrantAtDepth == null) { return -1; } return quadrantAtDepth.ordinal(); }