我知道圆上有三个点,分别代表圆弧的起点、中间和终点( a
、 m
和 b
)。我还使用 atan2(y,x)
从正 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
作为“结束”和 b
因为“开始”和后四个是相反的。请记住,有关的订单可以在 0 处环绕并出现在右侧或左侧,因此符号没有帮助。
有没有一种简洁的方法来确定哪个是起点,哪个是终点?除了在一个大而密集的 if/else-if block 中费力地检查 8 个选项中每个选项之间的相对值之外,就是这样。
实现语言是Python,但这不是特定于语言的问题!
最佳答案
如果m
位于从a
到b
有向线段的左侧,则a
是逆时针末端;否则为顺时针结束。
也就是说,取向量ab
的左垂线,并求其与am
的点积。如果点积为正,a 就是 CCW 端点。
顺便说一句,处理角度最简洁的方法是避免使用它们。一周中的任何一天,向量和线性代数都超出了角度和三角学的范畴。
关于algorithm - 从三个点/角度中识别弧的起点和终点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269089/