Red de conocimiento informático - Material del sitio web - 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.

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

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));

//}

//}

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;

}