概述
测试一个点,是否在一些列点构成的包围的区域上
在区域内: 返回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;
}