package de.fub.agg2graph.structs;
import java.awt.geom.Rectangle2D;
/**
* Specify a "rectangular" region from start point to the end point.
*
* invariant: minLocation <= maxLocation.
*/
public class GPSRegion {
public GPSPoint minLocation;
public GPSPoint maxLocation;
public GPSPoint getMinLocation() {
return minLocation;
}
public GPSPoint getMaxLocation() {
return maxLocation;
}
public GPSRegion(GPSPoint start, GPSPoint end) {
this.minLocation = new GPSPoint(Math.min(start.getLat(), end.getLat()),
Math.min(start.getLon(), end.getLon()));
this.maxLocation = new GPSPoint(Math.max(start.getLat(), end.getLat()),
Math.max(start.getLon(), end.getLon()));
}
public GPSRegion(double minLat, double minLon, double maxLat, double maxLon) {
this(new GPSPoint(minLat, minLon), new GPSPoint(maxLat, maxLon));
}
public Rectangle2D getRectangle() {
double startLat = minLocation.getLat();
double startLon = minLocation.getLon();
return new Rectangle2D.Double(startLon, startLat,
maxLocation.getLon() - startLon, maxLocation.getLat() - startLat);
}
public GPSRegion union(GPSRegion region) {
GPSPoint min = GPSPoint.min(minLocation, region.minLocation);
GPSPoint max = GPSPoint.max(maxLocation, region.maxLocation);
return new GPSRegion(min, max);
}
public double getMaxLatitude() {
return maxLocation.getLat();
}
public double getMaxLongitude() {
return maxLocation.getLon();
}
public double getMinLatitude() {
return minLocation.getLat();
}
public double getMinLongitude() {
return minLocation.getLon();
}
public boolean contains(GPSPoint location) {
return minLocation.getLon() <= location.getLon()
&& location.getLon() <= maxLocation.getLon()
&& minLocation.getLat() <= location.getLat()
&& location.getLat() <= maxLocation.getLat();
}
public boolean isEmpty() {
return minLocation.getLon() == 0. && maxLocation.getLon() == 0.
&& minLocation.getLat() == 0. && maxLocation.getLat() == 0.;
}
@Override
public String toString() {
return "<" + minLocation + ", " + maxLocation + ">";
}
}