double cw(node a,node b,node c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dist(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dist(node a,node b,node c)
{
double d=dist(a,b);
double res=cw(a,b,c);
return fabs(res/d);
}
bool cmp(node a,node b)
{
double ans=cw(p,a,b);
if(ans!=0)return cw(p,a,b)>0;
else return dist(p,a)>dist(p,b);//note
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n<3)
break;
scanf("%lf%lf%lf",&r,¢er.x,¢er.y);
int i;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
bool flag=true;
double dirt=0;
for(i=0;i<n-1;i++)
{
if(cw(a[i],a[i+1],a[(i+2)%n])!=0)
{
if(dirt==0)
dirt=cw(a[i],a[i+1],a[(i+2)%n]);
||cw(a[i],a[i+1],a[(i+2)%n])<0&&dirt>0)
{
flag=false;
break;
}
}
}
if(flag==false)
{
printf("HOLE IS ILL-FORMED\n");
continue;
}
for(i=0;i<n;i++)
{
double d=dist(a[i],a[(i+1)%n],center);
double res=cw(a[i],a[(i+1)%n],center);
if(d<r||res<0&&dirt>0
||res>0&&dirt<0||res==0)
{
flag=false;
break;
}
}
if(!flag)
{
printf("PEG WILL NOT FIT\n");
}
else
printf("PEG WILL FIT\n");
}
}
//
首先要判断多边形是否凸包。
由于题目是按照顺时针或逆时针方向给出所有点,所以不需要对所有点进行排序
使用叉积判断凸包
允许多点共线情况的存在
陷阱是:
圆心可能不在多边形内部
要求出圆心到多边形各边的距离,所有边的距离都要大于半径
求点到线段的距离的方法:利用叉积