Joe*_*yga 10 c++ geometry trigonometry
我正在寻找一个公式来找到圆上两度标记之间的最短距离:例如,30度和170度(140度).
两度标记实际上可以是任何实数,并且不一定在0到360之间(可以是负的,或者远大于360,例如-528.2和740(其为171.8度)).但是,距离应始终<= 180度且> = 0度.
听起来很简单.但是,我一直试图找到一个很好的解决方案,我已经尝试了很多不同的代码,但到目前为止我发现的所有情况都没有尝试过.我在c ++工作.有没有人有任何想法?
rua*_*akh 21
第1步:获得"原始"差异.例如,给定-528.2和740.0,这是1268.2.
raw_diff = first > second ? first - second : second - firstraw_diff = std::fabs(first - second)步骤2:减去倍数360.0以得到0.0(包括)和360.0(不包括)之间的值.
mod_diff = std::fmod(raw_diff, 360.0)第3步:如果此值大于180.0,则从中减去360.0.
dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diffdist = 180.0 - std::fabs(mod_diff - 180.0)作为一系列陈述,它可能是最具可读性的:
double raw_diff = first > second ? first - second : second - first;
double mod_diff = std::fmod(raw_diff, 360.0);
double dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diff;
Run Code Online (Sandbox Code Playgroud)
但如果需要,将它全部放入一个表达式并不难:
180.0 - std::fabs(std::fmod(std::fabs(first - second), 360.0) - 180.0)
Run Code Online (Sandbox Code Playgroud)