以转角法判断点是否在多边形中(C++部分代码)

以转角法判断点是否在多边形中(C++部分代码)

基本原理

转角法非常简单。如图1所示,从P点到顶点Vi分别做连线,其中αi为Vi和Vi+1之间的夹角。其中α角度逆时针为正,顺时针为负(具体哪个方向为正,哪个方向为负自己设),这样所有到顶点做连线之间夹角和为2Π或-2Π,这点P在多边形内部或边界,否则在外部。
注意,P点在多边形顶点上的情况,这种方法是无法判别的,需要单独讨论。
图1但是总体而言,这种方法能比射线法方便不少。特殊条件少了,利用向量也很容易求解。

所以判断步骤一共是两步,(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-2
PI)<0.00001 || abs(TotalRadian + 2
PI) <0.00001 )
{
//进行对选取范围内的点的相关操作
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值