package com.revolsys.elevation.cloud; import java.util.function.Consumer; import java.util.function.Predicate; import com.revolsys.elevation.tin.TriangulatedIrregularNetwork; import com.revolsys.elevation.tin.quadedge.QuadEdgeDelaunayTinBuilder; import com.revolsys.geometry.model.BoundingBoxProxy; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.GeometryFactoryProxy; import com.revolsys.geometry.model.Point; public interface PointCloud<P extends Point> extends GeometryFactoryProxy, BoundingBoxProxy { void forEachPoint(final Consumer<? super P> action); default TriangulatedIrregularNetwork newTriangulatedIrregularNetwork() { final GeometryFactory geometryFactory = getGeometryFactory(); final QuadEdgeDelaunayTinBuilder tinBuilder = new QuadEdgeDelaunayTinBuilder(geometryFactory); forEachPoint((point) -> { tinBuilder.insertVertex(point); }); final TriangulatedIrregularNetwork tin = tinBuilder.newTriangulatedIrregularNetwork(); return tin; } default TriangulatedIrregularNetwork newTriangulatedIrregularNetwork( final Predicate<? super Point> filter) { final GeometryFactory geometryFactory = getGeometryFactory(); final QuadEdgeDelaunayTinBuilder tinBuilder = new QuadEdgeDelaunayTinBuilder(geometryFactory); forEachPoint((point) -> { if (filter.test(point)) { tinBuilder.insertVertex(point); } }); final TriangulatedIrregularNetwork tin = tinBuilder.newTriangulatedIrregularNetwork(); return tin; } }