package com.revolsys.elevation.tin;
import java.util.function.Consumer;
import com.revolsys.geometry.index.quadtree.IdObjectQuadTree;
import com.revolsys.geometry.index.quadtree.QuadTree;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Triangle;
import com.revolsys.geometry.util.BoundingBoxUtil;
import com.revolsys.spring.resource.Resource;
public class CompactTriangulatedIrregularNetwork extends BaseCompactTriangulatedIrregularNetwork {
private final QuadTree<Integer> triangleSpatialIndex;
private final BoundingBox boundingBox;
public CompactTriangulatedIrregularNetwork(final GeometryFactory geometryFactory,
final int vertexCount, final double[] vertexXCoordinates, final double[] vertexYCoordinates,
final double[] vertexZCoordinates, final int triangleCount, final int[] triangle0VertexIndices,
final int[] triangle1VertexIndices, final int[] triangle2VertexIndices) {
super(geometryFactory, vertexCount, vertexXCoordinates, vertexYCoordinates, vertexZCoordinates,
triangleCount, triangle0VertexIndices, triangle1VertexIndices, triangle2VertexIndices);
this.triangleSpatialIndex = new IdObjectQuadTree<Integer>(geometryFactory) {
private static final long serialVersionUID = 1L;
@Override
protected boolean intersectsBounds(final Object id, final double x, final double y) {
final Integer triangleIndex = (Integer)id;
return newTriangleBoundingBox(triangleIndex).intersects(x, y);
}
@Override
protected boolean intersectsBounds(final Object id, final double minX, final double minY,
final double maxX, final double maxY) {
final Integer triangleIndex = (Integer)id;
return newTriangleBoundingBox(triangleIndex).intersects(minX, minY, maxX, maxY);
}
};
this.triangleSpatialIndex.setUseEquals(true);
final double[] bounds = BoundingBoxUtil.newBounds(2);
for (int triangleIndex = 0; triangleIndex < triangleCount; triangleIndex++) {
final BoundingBox triangleBoundingBox = newTriangleBoundingBox(triangleIndex);
this.triangleSpatialIndex.insertItem(triangleBoundingBox, triangleIndex);
BoundingBoxUtil.expand(bounds, 2, triangleBoundingBox);
}
this.boundingBox = geometryFactory.newBoundingBox(2, bounds);
}
@Override
public void forEachTriangle(final BoundingBox boundingBox,
final Consumer<? super Triangle> action) {
this.triangleSpatialIndex.forEach(boundingBox, (triangleIndex) -> {
final Triangle triangle = newTriangle(triangleIndex);
if (triangle != null) {
action.accept(triangle);
}
});
}
@Override
public BoundingBox getBoundingBox() {
return this.boundingBox;
}
@Override
public Resource getResource() {
// TODO Auto-generated method stub
return null;
}
}