Game- расчет расстояния между двумя координатами

У меня проблема с моим кодом. Поэтому наша задача заключалась в том, чтобы создать код, который будет вводить информацию из текстового файла (включая название города с его долготой и широтой) и создать игру, которая спрашивает «Какой город ближе всего к _____» и дает вам 3 варианта, из ты должен выбрать. Затем он говорит вам правильно / неправильно и показывает вам расстояния. Проблема в том, что мой код не рассчитывает расстояние между городами в километрах, а действительно странная форма. результат, например, 3.582e-307 и аналогичные. Вы знаете, в чем может быть проблема?

    #include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <string>
#include <time.h>
#include <random>
#include <numeric>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <ctime>
#define PI 3.14159265

using namespace std;

struct District {
double lng  ;
double lat ;
string city  ;
};
struct Distance {
double lng;
double lat;
};
//void for changing degrees to rad
double dtr(double deg) {
return (deg * PI / 180);
};

//void calculation of distance
// this doesnt work correctly - the output isnt the distance in KM, i used the formula from - https://en.m.wikipedia.org/wiki/Great-circle_distance
double* distancecalc (double pos[], double distance[]) {
Distance locat [4]  ;
District districts [79] ;
double posi [4];
for (int x=0; x<4; x++) {
posi [x] = pos [x] ;
}
for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat ;
locat [u].lng = districts [u]. lng;
locat [u].lat = dtr(locat [u].lat );
locat [u].lng =dtr (locat [u].lng) ;
}

//calculate the distance between cities (0 (base) and 1-3)
for (int u=0; u<4; u++) {
double ax = locat[0].lat, ay = locat[0].lng, bx = locat[u].lat, by = locat[u].lng;
distance[u] = acos (sqrt(pow(sin((bx-ax)/2.0), 2.0)+cos(ax)*cos(bx)*pow(sin((by-ay)/2.0),2.0))) * 2 * 6371;
return distance ;
}
}

int main () {
int z=1;
do { districts [79] ;
ifstream inputFile;

inputFile.open ("districts.txt") ;
if (!inputFile.is_open()){
cout << "opening txt document" << endl;
return 0 ;
}
//shuffle
int line ;
stringstream ss;
string sdouble ;
for (line=0; line<79; line++) {
getline(inputFile, districts[line].city, ';')  ;
getline(inputFile, sdouble,  ';') ;
ss<< sdouble;
ss>> districts[line].lng ;
getline(inputFile, sdouble, ';' ) ;
ss<<sdouble;
ss>>districts[line].lat;
getline(inputFile, sdouble) ;

}

//shuffle the cities+ coordinates- array
srand(time(NULL));
double tempn;
int pos1,pos2;
string temp;
for (int i = 0; i < 79; ++i){
pos1 = rand()%79;
pos2 = rand()%79;
temp = districts [pos1].city ;
districts [pos1].city =  districts [pos2].city;
districts [pos2].city = temp;
tempn = districts [pos1].lat;
districts [pos1].lat  =  districts [pos2].lat ;
districts [pos2].lat  = tempn;
tempn = districts [pos1].lng  ;
districts [pos1].lng  =  districts [pos2].lng ;
districts [pos2].lng  = tempn;
}

//game
double pos [4];
double distance [3];
int loop=0, answer=0, guess, total=0;
do {
double min=999999;
//cout - city + options
cout<< endl ;
cout << "Which city is the closest  to "<< districts[loop].city<< "? Pick one of the following: " <<endl;
pos [1] = loop;
loop++ ;
cout << "1) " << districts[loop].city << endl;
pos [2]= loop;
loop++ ;
cout << "2) " << districts[loop].city << endl;
pos [3] = loop;
loop++ ;
cout << "3) " << districts[loop].city << endl;
pos [4] = loop;
loop++ ;
//calculate the difference+ find answer (which is the closest)
cout << "Write your selection: " ;
cin>> guess;
for (int x=1; x<4; x++) {
if (min>distance[x] ) {
min= distance[x];
answer= x;
}
}
//if you guess the correct answer -
if (guess==answer) {
total++;
cout<< "Correct! The distances are: " << endl;
}
// if you guess the incorrect answer-
else {
cout<< "Incorrect! The distances are:" <<endl;
}
//witing the distances between 1 city
cout<< "1) " << districts[loop-3].city << "-  " << distance [1] << endl;
cout<< "2) " << districts[loop-2].city << "-  " <<  distance [2] << endl;
cout<< "3) " << districts[loop-1].city << "-  " << distance [3] << endl << endl;
for (int u=0 ; u< 80; u++) {
cout << "-" ;
}

} while(loop<40) ;
//end of game
cout << endl << "Conratulations, you finished the game! Your score is: " << total << " out of 10" << endl;
int selection ;
cout <<endl << "Do you want to play again?" << endl << "1= Yes" << endl << "0= No" << endl;
cout << "Your selection: " ;
cin>> selection;
if (selection== 0) {
z= 0;
}
else {
z=1;
if (system("CLS")) system("clear") ;
}
} while  (z==1 );
}**END OF CODE**

0

Решение

Ваши широты и долготы в градусах, верно? Вы можете избежать вызова функции для преобразования их в радианы:

constexpr double DEG2RAD = 3.141592653589793 / 180;

Чтобы:

for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat * DEG2RAD;
locat [u].lng = districts [u].lng * DEG2RAD;
}

Затем в ссылке, которую вы разместили формула отличается, вы используете acos вместо asin, но больше всего ты не прошел districts[] для функции, поэтому она является локальной для этой функции и неинициализированной. Вы должны решить, делать этот массив глобальным или нет.

Тогда вам нужно позвонить distancecalc() где-то…

0

Другие решения

в этой части вашего кода:

double* distancecalc (double pos[], double distance[]) {
Distance locat [4]  ;
District districts [79] ;
....
for (int u=posi[0]; u<posi[4]; u++) {
locat [u].lat = districts [u].lat ;
locat [u].lng = districts [u]. lng;
....

districts не инициализируется. localt получает случайные значения

0

По вопросам рекламы [email protected]