Solución:
Las fórmulas a las que se refiere en el texto son para calcular la distancia del gran círculo entre 2 puntos. Así es como calculo el ángulo entre puntos:
uses Math, ...;
...
const
cNO_ANGLE=-999;
...
function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
dx,dy:double;
begin
dx := X2 - X1;
dy := Y2 - Y1;
if (dx > 0) then result := (Pi*0.5) - ArcTan(dy/dx) else
if (dx < 0) then result := (Pi*1.5) - ArcTan(dy/dx) else
if (dy > 0) then result := 0 else
if (dy < 0) then result := Pi else
result := cNO_ANGLE; // the 2 points are equal
result := RadToDeg(result);
end;
-
Recuerde manejar la situación donde 2 puntos son iguales (verifique si el resultado es igual a cNO_ANGLE, o modifique la función para lanzar una excepción);
-
Esta función asume que estás en una superficie plana. Con las pequeñas distancias que ha mencionado, todo está bien, pero si va a calcular el rumbo entre ciudades de todo el mundo, es posible que desee buscar algo que tome la forma de la tierra en el recuento;
-
Es mejor proporcionar esta función con coordenadas que ya estén asignadas a una superficie plana. Sin embargo, puede alimentar WGS84 Latitude directamente en Y (y lon en X) para obtener una aproximación aproximada.
Aquí está la solución de C #. Probado para ángulos de 0, 45, 90, 135, 180, 225, 270 y 315.
Editar Reemplacé mi fea solución anterior, por la traducción C # de la solución de Wouter:
public double GetAzimuth(LatLng destination)
{
var longitudinalDifference = destination.Lng - this.Lng;
var latitudinalDifference = destination.Lat - this.Lat;
var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
if (longitudinalDifference > 0) return azimuth;
else if (longitudinalDifference < 0) return azimuth + Math.PI;
else if (latitudinalDifference < 0) return Math.PI;
return 0d;
}
public double GetDegreesAzimuth(LatLng destination)
{
return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}
Encontré este enlace
http://williams.best.vwh.net/avform.htm
dado en la respuesta a
Lat / Lon + Distancia + Rumbo -> Lat / Lon
Esto parece prometedor, especialmente la aproximación de tierra plana dada cerca del final.