我知道有三个点在一个圆圈上,代表弧线的起点,中间和终点(a
,m
和b
)。我也有这些点的角度,从正X轴逆时针方向,使用从中心到点的三个相应矢量的atan2(y,x)
,所以我们有-pi < theta < pi
。
我也知道哪个点是m
,我想知道的是a
和b
中的哪一个是弧的顺时针端。
我可以看到有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,但这不是特定于语言的问题!
答案 0 :(得分:1)
如果m
位于从a
到b
的有向线段的左侧,则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;
(嗯,我发现这比尝试理解和计算垂线、点积、线性代数要容易得多……)