判断点与多边形的关系(3):角度和法

“角度和法”的思路是:多边形内的点,与所有顶点顺次连接形成向量的夹角之和为2π。
图例说明,如下图所示:




O点在多边形之内,其与多边形所有顶点的连线,组成6个向量,顺次形成6个向量夹角,显而易见,这6个夹角之和为2π。



P点在多边形之外,其与多边形所有顶点的连线,组成6个向量,顺次形成6个向量夹角,显而易见,这6个夹角之和不等于2π。确切的说是小于2π。
计算夹角的方法可按如下公式实现:
θ=arccos(abab)

公式中,a和b就是组成夹角的两个向量,在反余弦函数括号中,分子部分为两个向量的点乘,分子部分为两个向量各自的2范数相乘。在这里要说明一下,如果要判断的点就是多边形顶点之一,则a和b其中之一的2范数为0,需要特别处理;如果点在多边形的边上,则有存在一个夹角为π的情况。这两种情况均可以认为该点在多边形的边上。
此方法和之前谈到的向量积法、面积法一样,可以直接适用于凸多边形,至于凹多边形,也可以用,不过要将凹的部分可能重复计算夹角的地方调整坐标在集合中的顺序后计算夹角。另外一个问题和面积法相似,就是计算角度存在一定的舍入误差,影响计算的精度。
参考代码:

int InPolygon_Angle(const CZPolygon& polygon, CZPoint_t pt){
    int itNumPt = polygon.size();
    CZPoint_t pt_1, pt_2;
    double duAngleAll = 0.0;
    for (int i = 0; i < (itNumPt - 1); i++) {
        pt_1 = polygon[i];
        pt_2 = polygon[i + 1];
        double duA = Angle(&pt, &pt_1, &pt_2);
        if ((NOANGLE == duA) || (ABS(duA - PI) < EPS))
            return ONSIDE;
        duAngleAll += duA;
    }
    return ABS(duAngleAll - 2*PI)<EPS ? INSIDE : OUTSIDE;
}

效果和博客http://blog.csdn.net/ezhchai/article/details/78864336一样,这里就不再重复贴了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值