题意:顺时针或逆时针给出n个点和一个圆,判断多边形是否为凸。且圆在多边形里面。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const double EPS = 1e-6; bool zero(double t){return -EPS<t&&t<EPS;} struct cvector{ double x,y; cvector(double a,double b){x=a,y=b;} cvector(){} }; cvector operator-(cvector a,cvector b){ return cvector(a.x-b.y,a.y-b.y); } cvector operator+(cvector a,cvector b){ return cvector(a.x+b.x,a.y+b.y); } cvector operator*(double a,cvector b){ return cvector(a*b.x,a*b.y); } double operator*(cvector a,cvector b){ return a.x*b.x+a.y*b.y; } double operator^(cvector a,cvector b){ return a.x*b.y-b.x*a.y; } double length(double t){return t<0?-t:t;} double length(cvector t){return sqrt(t*t);} cvector unit(cvector t){ return 1/length(t)*t; } struct cpoint{ double x,y; void get(){ scanf("%lf%lf",&x,&y); } cpoint(double a,double b){x=a,y=b;} cpoint(){} }; cvector operator-(cpoint a,cpoint b){ return cvector(a.x-b.x,a.y-b.y); } double dist(cpoint a,cpoint b){ return length(a-b); } struct cline{ cpoint a,b; cline(cpoint x,cpoint y){a=x,b=y;} }; struct circle{ cpoint a; double len; } cir; double dist(cpoint b,cline a){ cvector v = a.a-a.b; v=cvector(v.y,-v.x); v=unit(v); return length(v*(b-a.b)); } cpoint re[10009]; int main() { freopen("in.txt","r",stdin); int n; while(scanf("%d%lf%lf%lf",&n,&cir.len,&cir.a.x,&cir.a.y)==4&&n>2) { for(int i=1;i<=n;i++) re[i].get(); re[0]=re[n];re[n+1]=re[0]; // double t = (re[1]-re[n])^(re[n]-re[n-1]); double t=0.0; int i,fin=0; for(i=1;i<=n;i++) { if(((re[i+1]-re[i])^(re[i]-re[i-1]))*t<-EPS)break; if(zero(t)) t=((re[i+1]-re[i])^(re[i]-re[i-1])); if(((cir.a-re[i])^(re[i]-re[i-1]))*t<-EPS) fin=1; if(dist(cir.a,cline(re[i],re[i-1]))<cir.len) fin=1; } if(i<n) { printf("HOLE IS ILL-FORMED\n"); continue; } if(fin) printf("PEG WILL NOT FIT\n"); else printf("PEG WILL FIT\n"); } return 0; }