2013-10-16 94 views
0

第一次海報和我已經包含代碼(現在)的大圓距公式。代碼將一直運行,直到其中一個貨單/多條單據附有S/E作爲它們各自的方向(我試圖用S/E作爲「負向」)。任何幫助非常感謝!大圓距離C++

#include <iostream> 
#include <math.h> 
#include "lat.hpp" 
#include <string> 

#define PI 3.14159265 


double greatCircleDistance(double lat1, double long1, char latDir1 , 
          char longDir1, double lat2, double long2, 
          char latDir2, char longDir2) 
    { 
    double dLat; 
    double dLong; 

    latDirectionCheck(latDir1, lat1); 
    latDirectionCheck(latDir2, lat2); 
    longDirectionCheck(longDir1, long1); 
    longDirectionCheck(longDir2, long2); 

    dLat = (lat1 - lat2) ; 
    dLong = (long1 - long2); 

    positivify(dLat); 
    positivify(dLong); 
    positivify(lat1); 
    positivify(lat2); 

    //convert all numbers to Rad 
    dLat = convertRadians(dLat); 
    dLong = convertRadians(dLong); 
    lat1 = convertRadians(lat1); 
    lat2 = convertRadians(lat2); 

    double R = 3959.9; 
    double num1 = sin(dLat/2); 
    double num2 = sin(dLong/2); 



    double a = pow(num1,2) + cos(lat1) * cos(lat2) * 
       pow(num2,2); 
    double c = 2 * atan2(sqrt(a), sqrt(1-a)); 
    double d = R * c; 
    return d; 
    } 

double latDirectionCheck(char check, double convert) { 
    if(check == 'S') 
     convert = -convert; 
     return convert; 
} 

double longDirectionCheck(char check, double convert) { 
    if(check == 'E') 
     convert = -convert; 
     return convert; 
    } 

double positivify(double num) { 
    if (num < 0) 
    num = num*(-1); 
    return num; 
} 

bool compareFarDistance(double num1, double num2) { 
    bool statement = false; 
    if(num1 > num2) 
     statement = true; 
     return statement; 
} 

bool compareCloseDistance(double num1, double num2) { 
    bool statement = false; 
    if(num1 < num2) 
     statement = true; 
     return statement; 
} 
double convertRadians(double num) { 
    num = PI*(num/180); 
    return num; 
} 

double convertDegrees(double num) { 
    num = 180 * (num/PI); 
    return num; 

} 

輸入:23.4356/S 46.4731/W

距離輸出:4335.48

+1

請張貼一個簡單的例子 –

+0

你能描述更多的示例輸入/輸出不起作用嗎?例如,你如何知道它不起作用? – pippin1289

+1

'positivify'與'fabs'或浮點絕對值基本相同。確保儘可能使用標準庫函數 – pippin1289

回答

1

你不使用的各個方向單向函數的返回值或positivify功能,並通過他們採取的值的參數。所以他們沒有效果。您需要通過引用傳遞它們的參數或使用它們的返回值。否則,他們計算一個值並將其返回給忽略它的代碼。

+0

+1;但這僅僅是一個開始。 – Bathsheba

+0

在引用代碼中的返回值(dLat = latDirectionCheck(latDir1,lat1)後,我仍然看到相同的答案?我是否缺少更多的? – LeoVannini

+0

@LeoVannini我可以看到更新後的代碼嗎? –

0

除了編程錯誤(請參閱@David Schwartz),您的方法有缺陷,您將失去太多的精度;特別是當終點接近時。 (很簡單,混合pow與三角函數是浮點過度精度損失的一個方法)。

你應該使用Vincenty來代替。見http://en.wikipedia.org/wiki/Vincenty%27s_formulae

如果您的編譯器支持它,則使用M_PI,或者將PI定義爲雙精度極限。