package org.osm2world.viewer.view.debug;
import static java.awt.Color.WHITE;
import static java.lang.Math.*;
import org.osm2world.core.ConversionFacade.Results;
import org.osm2world.core.map_data.creation.MapProjection;
import org.osm2world.core.math.AxisAlignedBoundingBoxXZ;
import org.osm2world.core.math.VectorXZ;
import org.osm2world.core.target.jogl.JOGLTarget;
/**
* shows the latitude and longitude grid.
*/
public class LatLonDebugView extends DebugView {
@Override
public String getDescription() {
return "shows the latitude and longitude grid";
}
private static final double LINE_DIST = 1.0 / 3600;
private MapProjection mapProjection = null;
@Override
public void setConversionResults(Results conversionResults) {
super.setConversionResults(conversionResults);
mapProjection = conversionResults.getMapProjection();
}
@Override
public boolean canBeUsed() {
return map != null && mapProjection != null;
}
@Override
public void fillTarget(JOGLTarget target) {
AxisAlignedBoundingBoxXZ bound = map.getDataBoundary();
double minLon = toDegrees(mapProjection.calcLon(new VectorXZ(bound.minX, bound.minZ)));
double minLat = toDegrees(mapProjection.calcLat(new VectorXZ(bound.minX, bound.minZ)));
double maxLon = toDegrees(mapProjection.calcLon(new VectorXZ(bound.maxX, bound.maxZ)));
double maxLat = toDegrees(mapProjection.calcLat(new VectorXZ(bound.maxX, bound.maxZ)));
for (int x = (int)floor(minLon / LINE_DIST); x < (int)ceil(maxLon / LINE_DIST); x++) {
for (int z = (int)floor(minLat / LINE_DIST); z < (int)ceil(maxLat / LINE_DIST); z++) {
int widthLat = (z % 3600 == 0) ? 6
: (z % 60 == 0) ? 3 : 1;
if (widthLat > 1 || camera.getPos().y < 1000) {
target.drawLineStrip(WHITE, widthLat,
mapProjection.calcPos(z * LINE_DIST, x * LINE_DIST).xyz(0),
mapProjection.calcPos(z * LINE_DIST, (x+1) * LINE_DIST).xyz(0));
}
int widthLon = (x % 3600 == 0) ? 6
: (x % 60 == 0) ? 3 : 1;
if (widthLon > 1 || camera.getPos().y < 1000) {
target.drawLineStrip(WHITE, widthLon,
mapProjection.calcPos(z * LINE_DIST, x * LINE_DIST).xyz(0),
mapProjection.calcPos((z+1) * LINE_DIST, x * LINE_DIST).xyz(0));
}
}
}
}
}