算法 - 点是否在某区域内(平面多边形)

算法 - 点是否在某区域内

概述

   测试一个点,是否在一些列点构成的包围的区域上
   在区域内: 返回1; 在区域边界上: 返回-1;  在边界外: 返回0
   该算法是采用向量的算法

代码

struct IntPoint
{
    int X;
    int Y;
    int Z;
}; 
typedef std::vector<IntPoint> PolygonPoints;
int PointInPolygon(const IntPoint &pt, const PolygonPoints &path)
{
    // return Vlaue>> 0: Point out Polygon; 1: Point in Polygon; -1: Point on Polygon boundary
    int     result = 0;
    size_t  cnt = path.size();

    if (cnt < 3)
    {
        return 0;
    }

    IntPoint ip = path[0];
    for (size_t i = 1; i <= cnt; ++i)
    {
        IntPoint ipNext = (i == cnt ? path[0] : path[i]);
        if (ipNext.Y == pt.Y)
        {
            if ((ipNext.X == pt.X) || (ip.Y == pt.Y &&
                ((ipNext.X > pt.X) == (ip.X < pt.X))))
            {
                return -1;
            }
        }
        if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y))
        {
            if (ip.X >= pt.X)
            {
                if (ipNext.X > pt.X)
                {
                    result = 1 - result;
                }
                else
                {
                    double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
                    if (!d)
                    {
                        return -1;
                    }
                    if ((d > 0) == (ipNext.Y > ip.Y))
                    {
                        result = 1 - result;
                    }
                }
            }
            else
            {
                if (ipNext.X > pt.X)
                {
                    double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
                    if (!d)
                    {
                        return -1;
                    }
                    if ((d > 0) == (ipNext.Y > ip.Y))
                    {
                        result = 1 - result;
                    }
                }
            }
        }
        ip = ipNext;
    }
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值