作为更大算法的一部分,我正在遍历一组互连的线段。在通过线段到达任何顶点时,我需要找到从该点离开的最左边的线段。
作为一个例子,假设我从顶点A开始并沿着线段AB到达顶点B,我现在需要选择最左边的线段BC,BD,BE ...来到达下一个顶点。 / p>
我可以通过获取每对退出段的签名区域来实现此目的。如果三角形BDC的有符号区域为正,则BDC是逆时针方向的,因此BC落在BD的左侧。然后,我可以将BC与BE进行比较,并与其他段一起进行,以找到最左边的出口。但这仅适用于角度CBD急剧的情况。我将不得不添加一个特殊情况来处理钝的CBD。
必须有一种更简单的方法来做到这一点。有什么想法吗?
答案 0 :(得分:2)
将线段视为矢量。你想选择最左边的BC,BD,BE,......为此,计算BA(反方向为AB)与其他有向段BC,BD,BE,...之间的逆时针角度。
您想要的片段是CCW角度最大的片段。
要计算矢量BX的CCW角度,请使用atan2()计算BA和BX的方向角a
和x
。然后你的CCW角是(2π+ x-a)mod2π。 (即归一化为区间[0,2π])。