package com.revolsys.geometry.index.rtree;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import com.revolsys.geometry.index.BoundingBoxNode;
import com.revolsys.geometry.model.BoundingBox;
public abstract class RTreeNode<T> extends BoundingBoxNode {
public RTreeNode() {
}
protected abstract RTreeLeaf<T> chooseLeaf(final List<RTreeBranch<T>> path,
final BoundingBox boundingBox);
@Override
protected void expandBoundingBox(final BoundingBox boundingBox) {
super.expandBoundingBox(boundingBox);
}
public abstract void forEach(final double x, final double y, final Consumer<? super T> action);
public abstract void forEach(double minX, double minY, double maxX, double maxY,
Consumer<? super T> action);
public abstract void forEach(double minX, double minY, double maxX, double maxY,
Predicate<? super T> filter, Consumer<? super T> action);
public abstract void forEachValue(Consumer<? super T> action);
public abstract void forEachValue(Predicate<? super T> filter, Consumer<? super T> action);
protected double getRequiredExpansion(final BoundingBox boundingBox) {
double areaExpansion = 0;
final double minX1 = getMinX();
final double minY1 = getMinY();
final double maxX1 = getMaxX();
final double maxY1 = getMaxY();
final double minX2 = boundingBox.getMinX();
final double minY2 = boundingBox.getMinY();
final double maxX2 = boundingBox.getMaxX();
final double maxY2 = boundingBox.getMaxY();
final double maxWidth = Math.max(maxX1, maxX2) - Math.min(minX1, minX2);
final double maxHeight = Math.max(maxY1, maxY2) - Math.min(minY1, minY2);
if (minX1 > minX2) {
areaExpansion += (minX1 - minX2) * maxHeight;
}
if (maxX1 < maxX2) {
areaExpansion += (maxX2 - maxX1) * maxHeight;
}
if (minY1 > minY2) {
areaExpansion += (minY1 - minY2) * maxWidth;
}
if (maxY1 < maxY2) {
areaExpansion += (maxY2 - maxY1) * maxWidth;
}
return areaExpansion;
}
public abstract boolean remove(LinkedList<RTreeNode<T>> path, final double minX,
final double minY, final double maxX, final double maxY, T object);
protected abstract void updateEnvelope();
}