检查圆上的点是否在圆上的两个其他点之间

时间:2017-05-11 17:07:18

标签: c floating-point

我正在寻找比我目前编写的2种算法(在C中)更好的解决方案,以检查圆周上的点是否位于短弧创建< strong> 在同一个圈子上的另外两个点。

例如:p1 = 358度,p2 = 1度,我需要知道p3 = .5度是否位于p1和p2之间(解决方案应该如此)。

澄清:对于此用例,如果p1!= p3或p2!= p3,我检查“介于”。在极少数情况下(浮点数)我已经得到了我需要的答案。

这个问题由于有时逆行运动意味着p2

这一事实而变得复杂。 p1,也因为p1和p2可以跨越0/360度边界。

真实世界的用例是确定何时继续并应用插值算法来找到空间中两个物体之间的精确连接(掩星)时间,一个由p1和amp;表示。 p2在两个知道时间和p3处的不同对象。

3 个答案:

答案 0 :(得分:1)

使用header("Location...p1标记时钟方式的扇区的含义:

  

[编辑] OP已澄清目标是在p2之间的最短方向,顺时针或逆时针方向。留下这个答案就是代表单向情况的解决方案。

如果我们假设p1,p2在[-360 ... 360]范围内:

p1,p2,p3

没有#include <math.h> bool within_arc1(double p1, double p2, double p3) { return fmod(p2 - p1 + 2*360, 360) >= fmod(p3 - p1 + 2*360, 360); }

fmod()

如果bool within_arc2(double p1, double p2, double p3) { p3 -= p1; while (p3 < 0) p3 += 360; while (p3 > 360) p3 -= 360; p2 -= p1; while (p2 < 0) p2 += 360; while (p2 > 360) p2 -= 360; return p2 >= p3; } 可能是任何值

p1,p2,p3

答案 1 :(得分:1)

bool within_arc(double p1, double p2, double p3) {
  double cw_p1_to_p2, cw_p1_to_p3;
  cw_p1_to_p2 = fmod(p2 - p1 + 360, 360);
  cw_p1_to_p3 = fmod(p3 - p1 + 360, 360);

  return (cw_p1_to_p2 <= 180) != (cw_p1_to_p3 > cw_p1_to_p2);
}

更新:此解决方案不能始终如一地处理某些边缘情况,例如当p3完全等于其他点之一或p1p2恰好相隔180度时。

答案 2 :(得分:0)

基于chux的答案,这是我能想出的最好的方向:

bool within_arc(double p1, double p2, double p3) {
    double d21, d31, d32;

    p1 = fmod(p1, 360);
    p2 = fmod(p2, 360);
    p3 = fmod(p3, 360);
    d21 = fmod(p2 - p1 + 2 * 360, 360);
    d31 = fmod(p3 - p1 + 2 * 360, 360);
    d32 = fmod(p3 - p2 + 2 * 360, 360);
    if (d21 > 180)
        d21 = 360 - d21;
    if (d31 > 180)
        d31 = 360 - d31;
    if (d32 > 180)
        d32 = 360 - d32;
    return d21 >= d31 && d21 >= d32;
}