思路:判断点p是否在多边形中,随机取一个足够远的点p1,以点p为起始点,p1为终点,作射线L,由于多边形是有界的,所以射线L的终点一定在多边形外,很容易看出当L和多边形的交点数目count为奇数时,p在多边形内;count为偶数时,p在多边形外。
但是有些特殊情况需要处理:
1)p在多边形边上;
2)射线与多边形的顶点相交,将影响count的统计,为避免这种情况,这里的做法是另寻一条射线;
代码:
#define eps 1e-8
int inside_polygon(point p,int n,point* pt)//设多边形有n个顶点,pt是顶点数组
{
point p1;
int i=0,count;
while (i<n)
{
p1.x=rand()+offset,p1.y=rand()+offset;//随机取一个足够远的点p1
count=0;
for(int i=0;i<n;i++)
if(fabs(det(p,pt[i],pt[(i+1)%n]))<eps)&&dot(p,pt[i],pt[(i+1)%n])<eps)//点在边上,满足两个条件:外积=0,内积<=0
return 0;
else if(fabs(det(p,p1,pt[(i+1)%n]))<eps)//顶点pt[i]在直线pp1上,停止循环,另取p1
break;
else if(det(p,pt[i],pt[(i+1)%n])*det(p1,pt[i],pt[(i+1)%n])<-eps&&det(pt[i],p,p1)*det(pt[(i+1)%n],p,p1)<-eps)//pp1和pt[i]pt[i+1]相交
count++;
return count%2;
}