从三个点/角度中识别出弧的起点和终点

时间:2014-06-17 16:37:31

标签: algorithm sorting geometry geometric-arc

我知道有三个点在一个圆圈上,代表弧线的起点,中间和终点(amb)。我也有这些点的角度,从正X轴逆时针方向,使用从中心到点的三个相应矢量的atan2(y,x),所以我们有-pi < theta < pi

我也知道哪个点是m,我想知道的是ab中的哪一个是弧的顺时针端。

我可以看到有8种方法可以安排积分:

"East"       "West"     "East"
0          -pi | pi        0
---------------+-------------   
       a  m  b |           
          a  m | b         
             a | m  b 
               | a  m  b


       b  m  a |
          b  m | a
             b | m  a
               | b  m  a

前四个有a作为&#34;结束&#34;和b作为&#34;开始&#34;而后四者是另一种方式。请记住,有关的订单可以在0处回转并显示在右侧或左侧,因此符号无效。

是否有一个整洁的方法来解决哪个是开始,哪个是终点?除了费力地检查一个大的,密集的if / else-if块中的8个选项中的每个选项之间的相对值之外,就是这样。

实现语言是Python,但这不是特定于语言的问题!

2 个答案:

答案 0 :(得分:1)

如果m位于从ab的有向线段的左侧,则a是逆时针的一端;否则,顺时针方向结束。

即,采用向量ab的左垂直,并找到其am的点积。如果点积为正,则a为CCW端点。

顺便提一下,处理角度的最简单方法是避免使用它们。矢量和线性代数在一周中的任何一天都是整齐的角度和三角函数。

答案 1 :(得分:0)

我刚刚遇到了同样的问题 - 感谢您对问题的精彩撰写。我认为按照你的方式解决它实际上并不那么“费力”。

您可以使用您的表格来查看这只是三个角度循环排列的顺序的问题。 A < M < B 或 A > M > B.

           Utt File x y          z
1       xyzxyz  F01 1 A -2.5514777
2     hi there  F02 2 B -2.7582295
3 how are you?  F02 3 C  2.1081157
4        xxxxx  F03 4 D  0.1628507
5      yyzyzyz  F03 5 E -1.1904290
6       hybsfc  F12 6 F -1.1244349

根据您选择的语言如何将布尔值强制转换为整数,您可以将其写为:

// = a < m < b ||
//   b < a < m || 
//   m < b < a;
anticlockwise = a < m && m < b || b < a && a < m || m < b && b < a;

(嗯,我发现这比尝试理解和计算垂线、点积、线性代数要容易得多……)