ROS::判断点是否在多边形区域内

ROS::判断点是否在多边形区域内

原理为此链接介绍的射线法:链接

要求:多边形的边不能相交


#include <Eigen/Core>

const float EPS = 1e-6;
const float PI = 3.1415926535;

bool isInPolygon(float x,float y, geometry_msgs::Polygon& R)
{
    if(R.points.empty())
        return false;

    bool flag = false;
    Eigen::Vector2f Q(x,y);
    Eigen::Vector2f P1,P2; //多边形一条边的两个顶点

    size_t p_size = R.points.size();
    size_t loop_n = p_size - 1;
    for(size_t i=0;i<=loop_n;i++)
    {
        P1[0] = R.points[i].x;
        P1[1] = R.points[i].y;

        if(i==loop_n)
        {
            P2[0] = R.points[0].x;
            P2[1] = R.points[0].y;
        }
        else
        {
            P2[0] = R.points[i+1].x;
            P2[1] = R.points[i+1].y;
        }

        if(OnSegment(P1,P2,Q)) //点在多边形一条边上
        {
            return true;
        }

        if( (dcmp(P1[1]-Q[1])>0 != dcmp(P2[1]-Q[1])>0) &&
            (dcmp(Q[0] - (Q[1]-P1[1])*(P1[0]-P2[0])/(P1[1]-P2[1])-P1[0])<0) )
        {
            flag = !flag;;
        }
    }

    return flag;
}

int dcmp(float x)
{
    if(fabs(x)<EPS)
        return 0;
    else
        return x<0?-1:1;
}

bool OnSegment(const Eigen::Vector2f P1,
                       const Eigen::Vector2f P2,
                       Eigen::Vector2f Q)
{
    //向量1
    Eigen::Vector2f v1 = P1 - Q;
    //向量2
    Eigen::Vector2f v2 = P2 - Q;

    float v1Xv2 = v1[0]*v2[1] - v2[0]*v1[1];
    float v1_v2 = v1.transpose() *v2;

    return dcmp(v1Xv2)==0 && dcmp(v1_v2)<=0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值