POJ 1584 A Round Peg in a Ground Hole(点到直线距离,多边形是否为凸)

来源:互联网 发布:随机抽取算法 编辑:程序博客网 时间:2024/05/17 02:54

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


原创粉丝点击