2017-07-26 56 views
-2

我想從兩個地理位置找到指南針頭。 我在寫C應用程序。我寫了一個函數,如查找與地理座標的指南針標題

double CalculateHeading(double lat1, double long1, double lat2, double long2) 
{ 
    double Latitude = lat1 - lat2; 
    double Longitude = long1 - long2; 
    double angle = 0; 

    printf("\n#################################\n"); 
    printf("Lat1: %lf Lat2: %lf\n", lat1, lat2); 
    printf("Long1: %lf Long2: %lf\n", long1, long2); 
    printf("Lat Diff: %lf\n", Latitude); 
    printf("Long Diff: %lf\n", Longitude); 
    angle = atan2(Longitude, Latitude); 
    angle = radiansToDegrees(angle); 
    printf("Angle: %lf\n", angle); 
    printf("#################################\n"); 
    return angle; 
} 

但是這不適用於相同的位置。在這裏我傳遞了lat1,long1,lat2,long2的程度。 任何人都可以幫助我嗎?

http://www.movable-type.co.uk/scripts/latlong.html更新的代碼這是工作,

#define degreesToRadians(angleDegrees) (angleDegrees * M_PI/180.0) 
#define radiansToDegrees(angleRadians) (angleRadians * 180.0/M_PI) 

double CalculateHeading(double lat1, double lon1, double lat2, double lon2) 
{ 
    double lat1_rad = degreesToRadians(lat1); 
    double lat2_rad = degreesToRadians(lat2); 
    double diffLon = lon2-lon1; 
    double dLon = degreesToRadians(diffLon); 
    double y = sin(dLon) * cos(lat2_rad); 
    double x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(dLon); 
    double angle = 0; 

    angle = atan2(y,x); 
    printf("Angle: %lf\n", radiansToDegrees(fmod(angle + 360.0, 360.0))); 
    return angle; 
} 
+1

「不工作」不是正確的錯誤描述。你期望得到什麼結果?你會得到什麼結果?您的配方是否適用於紙張,並且您有C問題或您的配方已經錯誤? – Gerhardh

+0

除了在你的問題中缺少強制性信息外,第一個建議是你應該仔細看看atan2的參數。什麼是預期的,你通過了什麼? – Gerhardh

+0

你說「指南針標題」,但不要從「真北」改爲「磁北」。 –

回答

0
angle = atan2(y,x); 
printf("Angle: %lf\n", radiansToDegrees(fmod(angle + 360.0, 360.0))); 

在這裏你有角的弧度價值,因此增加360 是無稽之談。 可能的更正:

radiansToDegrees(fmod(angle + 2*Pi, 2*Pi)) 
or 
fmod(radiansToDegrees(angle) + 360.0, 360.0)