题意:顺时针或逆时针给出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;
}