package org.boehn.kmlframework.utils;

public class Ellipsoid {
	
	private static double a = 6378137; // default to wgs 84
	private static double f = 298.257223563; // default to wgs 84
	private static double fInverted = 1 / f;
	private static double eps2 = fInverted * (2d - fInverted);
	private static double k1 = Math.toRadians(a * (1d - eps2));
	private static double k2 = Math.toRadians(a);
	
	/**
	 * Convert meter to longitude at ref latitude
	 */
	public static final double meterToLongitude(double latitude) {
		return 1.0 / longitudeToMeter(latitude);
	}
	
	/**
	 * Convert meter to latitude at ref latitude
	 */
	public static final double meterToLatitude(double latitude) {
		return 1.0 / latitudeToMeter(latitude);
	}
	
	/**
	 * Convert longitude to meter at ref latitude
	 */
	public static final double longitudeToMeter(double latitude) {
		return (Math.cos(Math.toRadians(latitude)) * k2) / Math.sqrt(getDiv0(latitude));
	}
	
	/**
	 * Convert latitude to meter at ref latitude
	 */
	public static final double latitudeToMeter(double latitude) {
		return (k1 / Math.sqrt(Math.pow(getDiv0(latitude), 3)));
	}
	
	private static final double getDiv0(double latitude) {
		return 1.0 - eps2 * Math.pow(Math.sin(Math.toRadians(latitude)), 2);
	}
}