El radio promedio de la Tierra es 6371 kilómetros Dada la longitud y latitud de dos ciudades A y B en la Tierra, programe un programa para encontrar la distancia terrestre entre las dos ciudades.
#include
#include
usando el espacio de nombres std;
#ifndef M_PI
#define M_PI (3.141592653)
#endif
#define EARTH_R (6371.0)
#define MIN_DISTANCE (0.00001)//La resolución mínima es 1 cm
//Encuentra el valor absoluto del tipo doble
doble dabs(valor doble){
valor de retorno > 0,0 valor: (0,0 - valor? );
}
//Encuentra el mayor número de tipos dobles
double max(double a, double b){
return a > b ? a : b;
}
//Encuentra el número menor de tipo doble
double min(double a, double b){
devolver a < b ? a : b;
}
doble a Radianes(ángulo doble){
ángulo de retorno / 360.0 * 2 * M_PI;
}
//Dado el radio y el ángulo central (en radianes), encuentra la longitud de la cuerda correspondiente al ángulo central
double getChordByRadiusAngle (doble radio, doble ángulo){
return 2.0 * radio * sin((angle / 2.0));//Obtener la longitud de la cuerda
}
//Dado el radio y la longitud de la cuerda, encontramos el radian correspondiente al arco (radianes)
double getAngleByRadiusChord(doble radio, doble cuerda){
return 2.0 * asin(chord / 2,0 / radio);//Encuentra el ángulo central del círculo máximo correspondiente a la cuerda, en radianes
}
//Conocido el radio y la longitud de la cuerda, encuentra la distancia entre los puntos finales de la cuerda en la esfera
}
p>
double getArcByRadiusChord(doble radio, doble cuerda){
double angle =getAngleByRadiusChord (radio, cuerda);//Obtener el ángulo central del círculo máximo correspondiente a la cuerda en sistema de radianes
distancia doble = (M_PI * radio) * (ángulo / M_PI);
distancia de retorno;
}
//La longitud es la misma, pero la latitud es diferente Longitud de la cuerda entre dos puntos A y B
// Entrada: latitud del punto A ([90,-90], la latitud norte es positiva), latitud del punto B
/ /Salida: longitud de la cuerda entre los puntos A y B
doble chord_Longitude(doble latitudA, doble latitudB){
doble latitudDiff = dabs(latitudA - latitudB);
doub
le angle = toRadian(latitudeDiff);//Obtener el ángulo central del círculo máximo en radianes
return getChordByRadiusAngle(EARTH_R, angle);//Obtener la longitud de la cuerda
}
//La latitud es la misma, encuentre la longitud de la cuerda entre dos puntos A y B con diferente longitud
//Entrada: la longitud del punto A ([180,-180] , la longitud este es positiva), Longitud y latitud del punto B ([90,-90], la latitud norte es positiva)
//Salida: longitud de la cuerda entre los puntos A y B
doble cuerda_Latitud(doble longitudA, doble longitudB, doble latitud){
latitud = dabs(latitud);
doble laR = EARTH_R * cos((latitud / 180.0) * M_PI) ;//Obtener el radio de la bobina de latitud
double longitudeDiff = dabs(longitudeA - longitudeB);
longitudeDiff = longitudeDiff < 180.0 ? longitudeDiff : (360.0 - longitudeDiff);
doble ángulo = toRadian (longitudeDiff);
return getChordByRadiusAngle(laR, ángulo);//Obtener la longitud de la cuerda
}
//Entrar la longitud y latitud de dos puntos y averigüe la distancia entre dos puntos
//Ingreso: longitud del punto A ([180,-180], la longitud este es positiva), latitud del punto A ([90 ,-90], la latitud norte es positiva), B Longitud del punto, latitud del punto B
//Salida: distancia entre los puntos A y B
//Primero encuentra la cuerda longitud de los dos puntos, y luego encuentre el centro del gran círculo correspondiente al ángulo de la cuerda, y finalmente la longitud del gran arco es la distancia
doble distancia de 2 puntos (doble longitudA, doble latitudA, doble longitudB , doble latitudB){
doble cuerda = 0.0;
/*
if(longitudeA == longitudB){//La longitud es la misma p>
acorde = acorde_Longitud(latitudA, latitudB);
}else if(latitudA == latitudB){//Misma latitud
acorde = acorde_Latitud(longitudA, longitudB, latitudeA);
}else{*/
/ /Encuentra las longitudes de los cuatro lados de un trapezoide isósceles con AB como diagonal y las cuatro intersecciones de las dos latitudes y longitudes que pasan por puntos A y B como vértices
double baselineA = chord_Latitude(longitudeA, longitudeB, latitudeA);//La longitud de la línea inferior que pasa por el punto A
double baselineB = chord_Latitude(longitudeA , longitudB, latitudB);//La longitud de la línea inferior que pasa por el punto B
doble línea de baseB = chord_Longitude (latitudA, latitudB);//longitud de la cintura
> /*
if(baselineA == baselineB){//en realidad un rectángulo
chord = sqrt(baselineA * baselineA + cintura * cintura);
std::cout<<"Rectangle: "< }else{*/ double baselineS = min(baselineA, baselineB);//Más corto línea inferior de Lados de un triángulo rectángulo chord = sqrt(cintura * cintura - línea corta * línea corta + (línea de baseL - línea corta) * (línea de baseL - línea corta)); //} p> //} doble distancia = getArcByRadiusChord(EARTH_R, acorde); if(distancia >= MIN_DISTANCE){ return distancia; } retorno 0.0; } int main(){ parámetros dobles[ 4] ; int i; doble distancia; std::cout<<"Formato de entrada: punto A longitud A punto latitud B punto longitud B latitud del punto "< while(true){ i = 0; distancia = -1.0 ; while(std::cin>>params[i]){//Leer cuatro valores de longitud y latitud i++; if(4 = = i ){ descanso; } } si(4 == i){ distancia = distanciaDe2Puntos(params[0], params[1], params[2], params[3]); std::cout<<"Un punto("< }else{ break;//Al ingresar no -caracteres numéricos, finaliza el programa } } devuelve 0; }