zoukankan      html  css  js  c++  java
  • poj 1474 Video Surveillance 半平面交

    http://poj.org/problem?id=1474

    和前面做过的两道一样,又是一题判断多边形是否存在核问题,照样粘贴模板。

    点是顺时针给出。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 const double MAX =100000000;
     7 const double pi =acos(-1.0);
     8 const double eps=1e-8;
     9 int m,s;
    10 struct node
    11 {
    12 double x,y; //注意类型
    13 }tr[110],p[110],q[110];
    14 int sig(double k)
    15 {
    16 return (k<-eps)?-1:(k>eps);
    17 }
    18 void interect(node x,node y,double a,double b,double c)
    19 {
    20 double u=fabs(a*x.x+b*x.y+c);
    21 double v=fabs(a*y.x+b*y.y+c);
    22 q[++s].x=(x.x*v+y.x*u)/(u+v);
    23 q[s].y=(x.y*v+y.y*u)/(u+v);
    24 }
    25 //利用半平面切割
    26 void cut(double a,double b,double c)
    27 {
    28 s=0;
    29 int i;
    30 for(i=1;i<=m;i++) //遍历所有顶点是否能观察到该边
    31 {
    32    if(sig(a*p[i].x+b*p[i].y+c)>=0)//因为线段是顺时针给出的,如果是逆时针就是<=0
    33    {
    34     q[++s]=p[i]; //若是则存储
    35    }
    36    else
    37    {
    38     if(sig(a*p[i-1].x+b*p[i-1].y+c)>0)//逆时针就是<0
    39      interect(p[i-1],p[i],a,b,c);
    40     if(sig(a*p[i+1].x+b*p[i+1].y+c)>0)//逆时针就是<0
    41      interect(p[i+1],p[i],a,b,c);
    42    }
    43 }
    44 //最后的p数组存放半平面的点集合
    45 for(i=1;i<=s;i++)
    46    p[i]=q[i];
    47 p[s+1]=p[1],p[0]=p[s];
    48 m=s;
    49 }
    50 
    51 
    52 int main()
    53 {
    54 int n,i,j,t=1;
    55 while(scanf("%d",&n),n)
    56 {
    57    for(i=0;i<n;i++)
    58    {
    59     scanf("%lf%lf",&tr[i].x,&tr[i].y);
    60     p[i+1]=tr[i]; //初始化边界
    61    }
    62    tr[n]=tr[0];
    63    p[n+1]=p[1];p[0]=p[n];
    64    m=n;
    65    double a,b,c;
    66    for(i=0;i<n;i++)
    67    {
    68     a=tr[i+1].y-tr[i].y; //计算出相邻两点所在直线ax+by+c=0
    69     b=tr[i].x-tr[i+1].x;
    70     c=tr[i+1].x*tr[i].y-tr[i].x*tr[i+1].y;
    71     cut(a,b,c);
    72    }
    73    printf("Floor #%d\n",t++);
    74    if(!m) puts("Surveillance is impossible.");//这里如果有一个点,或者一条线段都可以,所以判断m是不是等于0就行了,不用判断面积
    75    else
    76     puts("Surveillance is possible.");
    77     printf("\n");
    78 }
    79 return 0;
    80 }
  • 相关阅读:
    标题:CSS-button添加display:block;属性后自动换行!
    JS-遍历对象
    JS-获取对象的长度大小
    HTML-span和div区别
    SQL-Foreach标签
    JS_Select_option切换自动触发事件
    JS_Select赋值的几种方式
    加密系统文件夹
    JS-返回上一页
    metronic 4.5.7开发环境下, 在Windows 10上安装了10.16.0版本的node js之后,导致node sass无法加载
  • 原文地址:https://www.cnblogs.com/zxj015/p/2740212.html
Copyright © 2011-2022 走看看