poj 1474 半平面交求多边形的核

来源:互联网 发布:工商银行博士后 知乎 编辑:程序博客网 时间:2024/04/28 18:28

【题意】

是否能在房间中找到一个位置来安装摄像头,使摄像头能监控到房间的每个角落。在平面图上,房间的墙只有横和竖的,没有斜的。

【题解】

判断多边形是否存在核。用半平面交判断。

【代码】

#include <iostream>#include <cmath>#define eps 1e-8#define oo 1e5using namespace std;const int maxn=105;struct point{       double x,y;}p[maxn],tp[maxn];int n,nn;int sig(double x){    if (x<-eps) return -1;    if (x>eps) return 1;    return 0;}void getline(const point& p1,const point& p2,double & a,double & b,double & c){     a=p2.y-p1.y;     b=p1.x-p2.x;     c=p2.x*p1.y-p2.y*p1.x;}point intersection(point u1,point u2,point v1,point v2){    point ret=u1;    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))    /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));    ret.x+=(u2.x-u1.x)*t;    ret.y+=(u2.y-u1.y)*t;    return ret;}void cut(int& n,point* p,point l1,point l2){     double a,b,c;     point pp[maxn];     int m=0,i;     getline(l1,l2,a,b,c);     for (i=0;i<n;i++)         if (sig(a*p[i].x+b*p[i].y+c)>=0)            pp[m++]=p[i];         else         {             int t=(i-1+n)%n;             if (sig(a*p[t].x+b*p[t].y+c)>0) pp[m++]=intersection(p[t],p[i],l1,l2);             t=(i+1)%n;             if (sig(a*p[t].x+b*p[t].y+c)>0) pp[m++]=intersection(p[t],p[i],l1,l2);         }     for (i=0;i<m;i++)         p[i]=pp[i];     n=m;}int main(){    freopen("pin.txt","r",stdin);    freopen("pou.txt","w",stdout);    int i,cc=0;    while (1)    {          cin >> n;          if (n==0) break;          for (i=0;i<n;i++)              cin >> p[i].x >> p[i].y;          nn=4;          tp[0].x=-oo;tp[0].y=oo;          tp[1].x=oo;tp[1].y=oo;          tp[2].x=oo;tp[2].y=-oo;          tp[3].x=-oo;tp[3].y=-oo;          for (i=0;i<n;i++)              cut(nn,tp,p[i],p[(i+1)%n]);          if (cc) cout << endl;          cout << "Floor #" << ++cc << endl;          if (nn<=0) cout << "Surveillance is impossible.\n";          else cout << "Surveillance is possible.\n";    }    return 0;}


原创粉丝点击