Ciao, se non ricordo male, si dovrebbe utilizzare la proiezione di Mercatore :
codice:
class Program
{
static void Main(string[] args)
{
double y = MercatorProjection.latToY(45.24191993424553);//latitudine di partenza
double dis_Y_NORD = y + 2500; // linea di 5 km, 2,5 a nord e 2,5 a sud del punto
double dis_Y_SUD = y - 2500;
double LAT_SUD = MercatorProjection.yToLat(dis_Y_SUD); // latitudine (2,5 km a sud del punto)
double LAT_NORD = MercatorProjection.yToLat(dis_Y_NORD); // latitudine (2,5 km a nord del punto)
}
}
/********************************************************/
//by Florian Müller
public static class MercatorProjection
{
private static readonly double R_MAJOR = 6378137.0;
private static readonly double R_MINOR = 6356752.3142;
private static readonly double RATIO = R_MINOR / R_MAJOR;
private static readonly double ECCENT = Math.Sqrt(1.0 - (RATIO * RATIO));
private static readonly double COM = 0.5 * ECCENT;
private static readonly double DEG2RAD = Math.PI / 180.0;
private static readonly double RAD2Deg = 180.0 / Math.PI;
private static readonly double PI_2 = Math.PI / 2.0;
public static double[] toPixel(double lon, double lat)
{
return new double[] { lonToX(lon), latToY(lat) };
}
public static double[] toGeoCoord(double x, double y)
{
return new double[] { xToLon(x), yToLat(y) };
}
public static double lonToX(double lon)
{
return R_MAJOR * DegToRad(lon);
}
public static double latToY(double lat)
{
lat = Math.Min(89.5, Math.Max(lat, -89.5));
double phi = DegToRad(lat);
double sinphi = Math.Sin(phi);
double con = ECCENT * sinphi;
con = Math.Pow(((1.0 - con) / (1.0 + con)), COM);
double ts = Math.Tan(0.5 * ((Math.PI * 0.5) - phi)) / con;
return 0 - R_MAJOR * Math.Log(ts);
}
public static double xToLon(double x)
{
return RadToDeg(x) / R_MAJOR;
}
public static double yToLat(double y)
{
double ts = Math.Exp(-y / R_MAJOR);
double phi = PI_2 - 2 * Math.Atan(ts);
double dphi = 1.0;
int i = 0;
while ((Math.Abs(dphi) > 0.000000001) && (i < 15))
{
double con = ECCENT * Math.Sin(phi);
dphi = PI_2 - 2 * Math.Atan(ts * Math.Pow((1.0 - con) / (1.0 + con), COM)) - phi;
phi += dphi;
i++;
}
return RadToDeg(phi);
}
private static double RadToDeg(double rad)
{
return rad * RAD2Deg;
}
private static double DegToRad(double deg)
{
return deg * DEG2RAD;
}
}
/********************************************************/
occhio che più ti avvicini al polo e meno è preciso
!!!!
altra possibilità è quella di usare (se ne hai la possibilità) DirectX e trattare il mondo come una sfera, ma probabilmente è meglio (oltre che più rapido anche meno farraginoso) Mercatore!