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]); else if(cw(a[i],a[i+1],a[(i+2)%n])>0&&dirt<0 ||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"); } } // 首先要判断多边形是否凸包。 由于题目是按照顺时针或逆时针方向给出所有点,所以不需要对所有点进行排序 使用叉积判断凸包 允许多点共线情况的存在 陷阱是: 圆心可能不在多边形内部 要求出圆心到多边形各边的距离,所有边的距离都要大于半径 求点到线段的距离的方法:利用叉积 |