使用三角函数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] 的范围。