C++ 游戏-计算两个坐标之间的距离

C++ 游戏-计算两个坐标之间的距离,c++,coordinates,distance,great-circle,C++,Coordinates,Distance,Great Circle,我的代码有问题。所以我们的任务是创建一个代码,它从一个txt文件输入信息(包括一个城市的名称及其经度和纬度),并制作一个游戏,询问“哪个城市最接近”并给你3个选项,你必须从中选择。然后它告诉您正确/不正确,并显示距离。问题是,我的代码没有以公里为单位计算城镇之间的距离,而是一种非常奇怪的形式。结果如3.582e-307和类似结果。你知道有什么问题吗 #include <iostream> #include <cstdlib> #include &l

我的代码有问题。所以我们的任务是创建一个代码,它从一个txt文件输入信息(包括一个城市的名称及其经度和纬度),并制作一个游戏,询问“哪个城市最接近”并给你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**
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义PI 3.14159265
使用名称空间std;
结构区{
双液化天然气;
双lat;
字符串城市;
};
结构距离{
双液化天然气;
双lat;
};
//将度数更改为rad时无效
双dtr(双度){
返回(deg*PI/180);
};
//距离的空隙率计算
//这不正确-输出不是以公里为单位的距离,我使用了以下公式-https://en.m.wikipedia.org/wiki/Great-circle_distance
双*距离计算(双位置[],双距离[]){
距离locat[4];
地区[79];;
双posi[4];

对于(int x=0;x,在代码的这一部分:

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;
....
double*distance计算(双位置[],双距离[]){
距离locat[4];
地区[79];;
....

对于(int u=posi[0];u您的纬度和经度是以度为单位的,对吗?可以避免调用函数将其转换为弧度:

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

for(int u=posi[0];u您不调用
distancecalc
。“void”不是“function”的同义词,而是一种类型。