三角関数を使用するsin()/cos()
と時間がかかり、精度が低下します。関数を使用する方がはるかに優れていremainder()
ます。可能な場合、結果は と同じ符号でx
、大きさは より小さいことに注意してくださいy
。
OPは正しい軌道に乗っていました!以下のソリューションは、-180 と + 180.0 のエッジ値ごとに簡単に調整できます。
#include <math.h>
// Reduce to (-180.0, 180.0]
double Limit_Longitude(double longitude_degrees) {
// A good implementation of `fmod()` will introduce _no_ loss of precision.
// -360.0 <= longitude_reduced <=- 360.0
double longitude_reduced = fmod(longitude_degrees, 360.0);
if (longitude_reduced > 180.0) {
longitude_reduced -= 360.0;
} else if (longitude_reduced <= -180.0) {
longitude_reduced += 360.0;
}
return longitude_reduced;
}
緯度を [-90 から +90] に制限するのは、緯度 +91 度が北極を通過しているのに経度 +/- 180 度を切り替えているため、よりトリッキーです。経度の精度を維持するには、0 度に向かって 180 ずつ調整します。
void Limit_Latitude_Longitude(double *latitude_degrees, double *longitude_degrees) {
*latitude_degrees = Limit_Longitude(*latitude_degrees);
int flip = 0;
if (*latitude_degrees > 90.0) {
*latitude_degrees = 180.0 - *latitude_degrees;
flip = 1;
} else if (*latitude_degrees < -90.0) {
*latitude_degrees = -180.0 - *latitude_degrees;
flip = 1;
}
if (flip) {
*longitude_degrees += *longitude_degrees > 0 ? -180.0 : 180.0;
}
*longitude_degrees = Limit_Longitude(*longitude_degrees);
}
マイナー: 目標は「経度を (-180.0, 180.0] に制限する」ことですが、[-180.0, 180.0)、[-180.0, 180.0] の範囲がより一般的に必要になると思います。