2

我知道三个点在一个圆上,它们代表弧的开始、中间和结束(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作为“结束”和b作为“开始”,而后四个则相反。请记住,订单约可以在 0 处环绕并出现在右侧或左侧,因此符号没有帮助。

有没有一种简洁的方法来确定哪个是起点,哪个是终点?除了在一个大而密集的 if/else-if 块中费力地检查 8 个选项中的每一个之间的相对值之外,就是这样。

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

4

2 回答 2

2

如果在从到m的有向线段的左侧,则为逆时针终点;否则,顺时针结束。aba

即取向量 的左垂线ab,求其与 的点积am。如果点积为正,则 a 是 CCW 端点。

顺便说一句,处理角度最简洁的方法是避免使用它们。一周中的任何一天,向量和线性代数都比角度和三角更整洁。

于 2014-06-17T16:51:23.183 回答
0

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

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

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

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

anticlockwise = (a < m + m < b + b < a) === 2;

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

于 2021-07-29T09:29:50.133 回答