Distancia entre dos coordenadas usando C
Hoy te mostraré cómo calcular la distancia entre dos puntos del globo terráqueo a partir de las coordenadas de los mismos, usando el lenguaje de programación C. Por ejemplo, sabremos la distancia que hay entre dos ciudades o lugares usando solo sus coordenadas.
Al final tendremos un programa en C que nos dirá la distancia que hay entre dos puntos en línea recta, con el resultado en kilómetros que al final podremos convertir a otra unidad como metros o millas.
Por cierto, vamos a usar la fórmula del semiverseno, también conocida como Haversine.
Nota: esto es distinto a calcular la distancia entre dos puntos de un plano cartesiano, aquí vamos a calcular la distancia entre dos puntos geográficos, es decir, dos lugares del planeta Tierra.
Para calcular la distancia simplemente nos vamos a basar en la fórmula y la aplicación de la misma, así como la conversión de grados a radianes, ya que necesitamos operar con radianes.
Después, vamos a encerrar la fórmula en una función para separar el código y reutilizarlo cuando sea necesario.
El método va a recibir los 2 puntos con su latitud y longitud. Así que va a recibir la latitud 1, longitud 1, latitud 2 y longitud 2. Devolverá la distancia en kilómetros:
/*
Recibe dos pares de coordenadas en grados (así como las da Google maps)
Regresa la distancia que hay entre esos dos puntos en Kilómetros
*/double calcularDistanciaEntreDosCoordenadas(double lat1, double lon1, double lat2, double lon2)
{
// Convertir todas las coordenadas a radianes
lat1 = gradosARadianes(lat1);
lon1 = gradosARadianes(lon1);
lat2 = gradosARadianes(lat2);
lon2 = gradosARadianes(lon2);
// Aplicar fórmula
double RADIO_TIERRA_EN_KILOMETROS = 6371;
double diferenciaEntreLongitudes = (lon2 - lon1);
double diferenciaEntreLatitudes = (lat2 - lat1);
double a = pow(sin(diferenciaEntreLatitudes / 2.0), 2) + cos(lat1) * cos(lat2) * pow(sin(diferenciaEntreLongitudes / 2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double d = RADIO_TIERRA_EN_KILOMETROS * c;
return d;
}
Como puedes ver en la línea 8 a 11, estamos convirtiendo todas las coordenadas a radianes para poder operar con ellas sin problemas. Después simplemente hacemos los cálculos usando la fórmula a través de las funciones trigonométricas y regresamos el resultado.
Por cierto, fíjate en que dentro de la función usamos a Pi.
Te mostraré el código completo en donde importamos las librerías necesarias y mostramos un ejemplo de uso. En este caso calcularé la distancia que hay entre la CDMX y un lugar de Yucatán.
El código queda así:
// https://parzibyte.me
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979323846
double gradosARadianes(double grados)
{
return grados * PI / 180;
}
/*
Recibe dos pares de coordenadas en grados (así como las da Google maps)
Regresa la distancia que hay entre esos dos puntos en Kilómetros
*/double calcularDistanciaEntreDosCoordenadas(double lat1, double lon1, double lat2, double lon2)
{
// Convertir todas las coordenadas a radianes
lat1 = gradosARadianes(lat1);
lon1 = gradosARadianes(lon1);
lat2 = gradosARadianes(lat2);
lon2 = gradosARadianes(lon2);
// Aplicar fórmula
double RADIO_TIERRA_EN_KILOMETROS = 6371;
double diferenciaEntreLongitudes = (lon2 - lon1);
double diferenciaEntreLatitudes = (lat2 - lat1);
double a = pow(sin(diferenciaEntreLatitudes / 2.0), 2) + cos(lat1) * cos(lat2) * pow(sin(diferenciaEntreLongitudes / 2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
double d = RADIO_TIERRA_EN_KILOMETROS * c;
return d;
}
int main(int argc, char const *argv[])
{
//19.418596787147735, -99.13722247901451
double latitud1 = 19.418596787147735;
double longitud1 = -99.13722247901451;
//20.96173231042663, -89.59867366422759
double latitud2 = 20.96173231042663;
double longitud2 = -89.59867366422759;
printf("Calculando distancia entre %lf,%lf y %lf,%lf\n", latitud1,longitud1,latitud2,longitud2);
// Calcular
double distancia = calcularDistanciaEntreDosCoordenadas(latitud1, longitud1, latitud2, longitud2);
printf("La distancia es: %lf Km\n", distancia);
return 0;
}
Al ejecutarlo, los resultados son correctos. De hecho hice el mismo cálculo con Google maps y los resultados son iguales como puedes observar en la siguiente imagen. Ahí en el código dejé las coordenadas por si quieres comprobarlo a tu manera.
Ya a partir de esta función tú puedes solicitar datos al usuario para las coordenadas, mostrar lugares cercanos a determinado lugar, etcétera.
Para terminar te dejo más posts sobre C.
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a…
Hoy te enseñaré a extraer la cadena base64 de una clave PEM usando una función…
Encender un foco con un Bot de Telegram es posible usando una tarjeta como la…
Esta web usa cookies.