作为更大算法的一部分,我正在遍历一组相互连接的线段。当通过线段到达任何顶点时,我需要找到从该点离开的最左边的线段。
例如,假设我从顶点A开始沿着线段AB到达顶点B,我现在需要选择线段BC、BD、BE的最左边…到达下一个顶点。
我可以通过采取每一对退出段的签名区域来做到这一点。如果三角形BDC的签名区域是正的,那么BDC是逆时针方向的,所以BC落在BD.的左边,然后我可以将BC与BE进行比较,并与其他段一样继续寻找最左边的出口。但这只适用于角度CBD很尖锐的情况。我得加一个特例来处理钝的中央商务区。
必须有一种更简单的方法来做到这一点。有什么想法吗?
最佳答案
将线段视为向量。你想选择最左边的BC,BD,BE为此,计算BA(反向为AB)与其他定向段BC、BD、BE之间的逆时针角。。
您需要的段是具有最大CCW角度的段。
要计算矢量bx的逆时针角度,请使用atan2()计算ba和bx的方向角a
和x
。那么你的逆时针角是(2π+x-a)mod 2π。(即归一化为区间[0,2π])。