be-graphe/src/main/org/insa/graphics/drawing/PlateCarreProjection.java

68 lines
2.2 KiB
Java

package org.insa.graphics.drawing;
import org.insa.graph.GraphStatistics.BoundingBox;
public class PlateCarreProjection implements Projection {
// Bounding box
private final float minLatitude, minLongitude, maxLatitude, maxLongitude;
// Dimension of the image
private final double width, height;
/**
* Create a new PlateCarreProjection corresponding to the given BoundingBox and
* maxSize.
*
* @param boundingBox Box for this projection.
* @param maxSize Maximum size of any side (width / height) of the image to
* which this projection should draw.
*/
public PlateCarreProjection(BoundingBox boundingBox, int maxSize) {
// Find minimum/maximum longitude and latitude.
this.minLongitude = boundingBox.getTopLeftPoint().getLongitude();
this.maxLongitude = boundingBox.getBottomRightPoint().getLongitude();
this.minLatitude = boundingBox.getBottomRightPoint().getLatitude();
this.maxLatitude = boundingBox.getTopLeftPoint().getLatitude();
float diffLon = maxLongitude - minLongitude, diffLat = maxLatitude - minLatitude;
this.width = diffLon < diffLat ? (int) (maxSize * diffLon / diffLat) : maxSize;
this.height = diffLon < diffLat ? maxSize : (int) (maxSize * diffLat / diffLon);
}
@Override
public double getImageWidth() {
return this.width;
}
@Override
public double getImageHeight() {
return this.height;
}
@Override
public int latitudeToPixelY(float latitude) {
return (int) (this.height * (this.maxLatitude - latitude)
/ (this.maxLatitude - this.minLatitude));
}
@Override
public int longitudeToPixelX(float longitude) {
return (int) (this.width * (longitude - this.minLongitude)
/ (this.maxLongitude - this.minLongitude));
}
@Override
public float pixelYToLatitude(double py) {
return (float) (this.maxLatitude
- py / this.height * (this.maxLatitude - this.minLatitude));
}
@Override
public float pixelXToLongitude(double px) {
return (float) (px / this.width * (this.maxLongitude - this.minLongitude)
+ this.minLongitude);
}
}