在我的c ++程序中,我需要计算球体上两个球面点(在方位角和仰角上给出)之间的距离。 这种计算需要经常进行,但我不需要高精度(1度应该足够)。 (距离在所有范围[0-180])
我使用探查器(valgrind)来寻找瓶颈。事实证明,我的运行时间的70%用于计算大圆距离。在这个函数中,60%的时间用于计算正弦或余弦或其他三角函数......
我尝试了不同的方法:(全部使用命名空间std;)
double tmp = sin(el1) * sin(el2) + cos(el1) * cos(el2) * cos(az1-az2);
double distance = acos(tmp);
或
typedef boost::geometry::model::point<double, 2, boost::geometry::cs::spherical_equatorial<boost::geometry::radian> > spherical_point;
spherical_point p1(az2,el2);
spherical_point p2(az1,el2);
double distance = hv.apply(p1,p2); % here hv is a haversine<double> object
或
double daz_half = (az2 - az1)/2;
double del_half = (el2 - el1)/2;
double tel = sin(del_half);
double taz = sin(daz_half);
double a = tel*tel + cos(el2) * cos(el1) * taz * taz ;
double distance = 2*atan2(sqrt(a),sqrt(1-a));
所有计算都会导致类似的运行时间,这些运行时间花在不同的三角函数上......
是否有人知道大圆距离公式的良好近似值,精度会降低?
或者是否有人知道如何加快sin cos acos atan2的计算...
预先确定自己的三角函数查找表是否有意义?
如果是,那么最佳效果如何(二分搜索或线性,矢量或集合......)?