圆上两度标记之间的最短距离?

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 - first
    • 其他方式: raw_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_diff
    • 其他方式: dist = 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)