/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.cepmuvakkit.times.posAlgo;
/**
* @author mgeden
*/
public class EarthPosition {
private double mLatitude;
private double mLongitude;
private double mTimezone;
private int mAltitude, mTemperature, mPressure;
public EarthPosition() {
this(32.85, 39.95, 2, 10, 1010, 0);
}
public EarthPosition(double latitude, double longitude) {
this(latitude, longitude, Math.round(longitude / 15.0), 0, 10, 1010);
}
public EarthPosition(double latitude, double longitude, double timezone, int altitude, int temperature, int pressure) {
mLatitude = latitude;
mLongitude = longitude;
mTimezone = timezone;
mTemperature = temperature;
mPressure = pressure;
mAltitude = altitude;
}
public EarthPosition(float latitude, float longitude, float timezone, int altitude, int temperature, int pressure) {
mLatitude = (double) latitude;
mLongitude = (double) longitude;
mTimezone = (double) timezone;
mTemperature = temperature;
mPressure = pressure;
mAltitude = altitude;
}
public double getLatitude() {
return mLatitude;
}
public double getLongitude() {
return mLongitude;
}
public double getTimezone() {
return mTimezone;
}
public short getAltitude() {
return (short) mAltitude;
}
public short getPressure() {
return (short) mPressure;
}
public short getTemperature() {
return (short) mTemperature;
}
public EarthHeading toEarthHeading(EarthPosition target) {
// great circle formula from:
// http://williams.best.vwh.net/avform.htm
double radPerDeg = Math.PI / 180;
double lat1 = Math.toRadians(mLatitude); //7155849931833333333e-19 0.71
double lat2 = Math.toRadians(target.getLatitude()); //3737913479489224943e-19 0.373
double lon1 = Math.toRadians(-mLongitude); //-5055637064497558276 e-19 -0.505
double lon2 = Math.toRadians(-target.getLongitude());//-69493192920839161e-17 -0.69
double a = Math.sin((lat1 - lat2) / 2);
double b = Math.sin((lon1 - lon2) / 2);
double d = 2 * MATH.asin(Math.sqrt(a * a + Math.cos(lat1) * Math.cos(lat2) * b * b));//3774840207564380360e-19
//d=2*asin(sqrt((sin((lat1-lat2)/2))^2 + cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
double tc1 = 0;
// double c=a*a+Math.cos(lat1)*Math.cos(lat2))*b*b
if (d > 0) {
if ((Math.sin(lon2 - lon1)) < 0) //tc1=acos((sin(lat2)-sin(lat1)*cos(d))/(sin(d)*cos(lat1)))
{
tc1 = MATH.acos((Math.sin(lat2) - Math.sin(lat1) * Math.cos(d)) / (Math.sin(d) * Math.cos(lat1)));//2646123918118404228e-18
} else {
tc1 = 2 * Math.PI - MATH.acos((Math.sin(lat2) - Math.sin(lat1) * Math.cos(d)) / (Math.sin(d) * Math.cos(lat1)));
}
}
// tc1=2*pi-acos((sin(lat2)-sin(lat1)*cos(d))/(sin(d)*cos(lat1)))
return new EarthHeading((tc1 / radPerDeg), (long) (d * 6371000));
}
}