package org.osm2world.core.map_elevation.creation; import java.util.Collection; import org.osm2world.core.map_elevation.creation.DelaunayTriangulation.NaturalNeighbors; import org.osm2world.core.math.AxisAlignedBoundingBoxXZ; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.VectorXZ; /** * uses natural neighbor interpolation of heights */ public class NaturalNeighborInterpolator 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); int i = 0; //TODO remove int total = sites.size(); long startTime = System.currentTimeMillis(); for (VectorXYZ site : sites) { if (++i % 1000 == 0) System.out.println("KS: " + i + "/" + total + " after " + ((System.currentTimeMillis() - startTime) / 1e3)); triangulation.insert(site); } } @Override public VectorXYZ interpolateEle(VectorXZ pos) { NaturalNeighbors nn = triangulation.probe(pos); double ele = 0; for (int i = 0; i < nn.neighbors.length; i++) { ele += nn.neighbors[i].y * nn.relativeWeights[i]; } return pos.xyz(ele); } }