POJ 3335 Rotating Scoreboard

来源:互联网 发布:贵州广电网络好吗 编辑:程序博客网 时间:2024/04/28 12:27

题意:求多边形内是否存在一点,使该点能看到每一个边上的点:

思路:判断多边形是否存在核,求任意两个能相交边的交点,判断该交点是否在多边形内;;;


#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <queue>#include <stack>using namespace std;const double INF  = 1e20;const double EPS = 1e-12;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.x,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);}struct cpoint{    double x,y;    void get(){scanf("%lf%lf",&x,&y);}} re[109];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 segline{    cpoint a,b;    segline(cpoint x,cpoint y){a=x,b=y;}    segline(){}};cpoint intersection(segline u,segline v){    cpoint ret=u.a;    double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/    ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));    ret.x+=(u.b.x-u.a.x)*t;    ret.y+=(u.b.y-u.a.y)*t;    return ret;}int main(){    freopen("in.txt","r",stdin);    int n,cas;    scanf("%d",&cas);    while(cas--)    {        scanf("%d",&n);        for(int i=0;i<n;i++) re[i].get();        re[n] = re[0];        int fin = 0;        for(int i=0;i<n&&!fin;i++)        for(int j=i+1;j<n&&!fin;j++)        {            if(!zero((re[j]-re[j+1])^(re[i]-re[i+1])))            {                cpoint xx = intersection(segline(re[i],re[i+1]),segline(re[j],re[j+1]));               // cout<<xx.x<<" "<<xx.y<<endl;                int k;                for(k=0;k<n;k++)                {                    if(((re[k]-re[k+1])^(xx-re[k+1]))<-EPS) break;                }                if(k>=n) fin = 1;            }        }        if(fin) printf("YES\n");        else printf("NO\n");    }    return 0;}


原创粉丝点击