以转角法判断点是否在多边形中(C++部分代码)
基本原理
转角法非常简单。如图1所示,从P点到顶点Vi分别做连线,其中αi为Vi和Vi+1之间的夹角。其中α角度逆时针为正,顺时针为负(具体哪个方向为正,哪个方向为负自己设),这样所有到顶点做连线之间夹角和为2Π或-2Π,这点P在多边形内部或边界,否则在外部。
注意,P点在多边形顶点上的情况,这种方法是无法判别的,需要单独讨论。
但是总体而言,这种方法能比射线法方便不少。特殊条件少了,利用向量也很容易求解。
所以判断步骤一共是两步,(1)计算角度(2)判断方向以判断正负号。我采用余弦定理计算夹角,利用矢量间的叉乘公式以判断方向。
这种算法有两个要注意的地方:
首先,根据余弦定理反解出的弧度值在0——Pi之间,这个是不带方向的;
其次,要对夹角方向进行判别,以确定弧度值的正负。
//核心代码如下
//OA[2]、OB[2]分别存储向量OA与OB的坐标表示信息
for(…)
{
OA…
OB…
//余弦公式求夹角
CurrentRadian =cos( (OA[0]* OA[0]+OA[1] * OA[1] + OB[0]* OB[0]+OB[1] * OB[1] -(OB[0])-OA[0])(OB[0]-OA[0])- (OB[1] -OA[1] )(OB[1] -OA[1] ) ) /( 2* sqrt(OA[0]*OA[0]+OA[1] *OA[1] ) * sqrt(OB[0]*OB[0]+ OB[1] *OB[1] ) ));
//叉乘求方向,判别是否为顺时针
if ((OA[0]OB[1]-OA[1]OB[0])<0)
{
TotalRadian = TotalRadian + CurrentRadian;
}
else
{
TotalRadian = TotalRadian - CurrentRadian;
}
}
//判别该点是否在选取范围内
if ( abs(TotalRadian-2PI)<0.00001 || abs(TotalRadian + 2PI) <0.00001 )
{
//进行对选取范围内的点的相关操作
}