package org.osm2world.core.map_elevation.creation; import java.util.Collection; import org.osm2world.core.map_elevation.creation.DelaunayTriangulation.DelaunayTriangle; import org.osm2world.core.math.AxisAlignedBoundingBoxXZ; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.VectorXZ; /** * triangulates the point set of elevation sites, * then interpolates linearly within each triangle * (i.e. treats the triangles as flat) */ public class LinearInterpolator implements TerrainInterpolator { private DelaunayTriangulation triangulation; @Override public void setKnownSites(Collection<VectorXYZ> sites) { AxisAlignedBoundingBoxXZ boundingBox = new AxisAlignedBoundingBoxXZ(sites); boundingBox = boundingBox.pad(100); triangulation = new DelaunayTriangulation(boundingBox); for (VectorXYZ site : sites) { triangulation.insert(site); } } @Override public VectorXYZ interpolateEle(VectorXZ pos) { DelaunayTriangle triangle = triangulation.getEnlosingTriangle(pos); double ele = triangle.asTriangleXYZ().getYAt(pos); return pos.xyz(ele); } }