package com.github.davidmoten.rtree.geometry;
import com.github.davidmoten.guavamini.annotations.VisibleForTesting;
public final class Geometries {
private Geometries() {
// prevent instantiation
}
public static Point point(double x, double y) {
return Point.create(x, y);
}
public static Point point(float x, float y) {
return Point.create(x, y);
}
public static Rectangle rectangle(double x1, double y1, double x2, double y2) {
return RectangleImpl.create(x1, y1, x2, y2);
}
public static Rectangle rectangle(float x1, float y1, float x2, float y2) {
return RectangleImpl.create(x1, y1, x2, y2);
}
public static Circle circle(double x, double y, double radius) {
return Circle.create(x, y, radius);
}
public static Circle circle(float x, float y, float radius) {
return Circle.create(x, y, radius);
}
public static Line line(double x1, double y1, double x2, double y2) {
return Line.create(x1, y1, x2, y2);
}
public static Line line(float x1, float y1, float x2, float y2) {
return Line.create(x1, y1, x2, y2);
}
public static Rectangle rectangleGeographic(double lon1, double lat1, double lon2,
double lat2) {
return rectangleGeographic((float) lon1, (float) lat1, (float) lon2, (float) lat2);
}
public static Rectangle rectangleGeographic(float lon1, float lat1, float lon2, float lat2) {
float x1 = normalizeLongitude(lon1);
float x2 = normalizeLongitude(lon2);
if (x2 < x1) {
x2 += 360;
}
return rectangle(x1, lat1, x2, lat2);
}
public static Point pointGeographic(double lon, double lat) {
return point(normalizeLongitude(lon), lat);
}
@VisibleForTesting
static double normalizeLongitude(double d) {
return normalizeLongitude((float) d);
}
private static float normalizeLongitude(float d) {
if (d == -180.0f)
return -180.0f;
else {
float sign = Math.signum(d);
float x = Math.abs(d) / 360;
float x2 = (x - (float) Math.floor(x)) * 360;
if (x2 >= 180)
x2 -= 360;
return x2 * sign;
}
}
}