zoukankan      html  css  js  c++  java
  • POJ 1474 半平面交

    题意:

    判断多边形是否存在核。

    题解:
    最终的交点数组中没有点则没有核。

    View Code
      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdlib>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <cmath>
      7 
      8 #define N 2222
      9 #define EPS 1e-7
     10 #define INF 1e9
     11 
     12 using namespace std;
     13 
     14 struct PO
     15 {
     16     double x,y;
     17 }p[N],tp[N],s[N],o;
     18 
     19 int n,cas;
     20 
     21 inline void read()
     22 {
     23     for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
     24     p[n+1]=p[1];
     25 }
     26 
     27 inline PO operator -(PO a,PO b)
     28 {
     29     PO c;
     30     c.x=a.x-b.x;
     31     c.y=a.y-b.y;
     32     return c;
     33 }
     34 
     35 inline int dc(double x)
     36 {
     37     if(x>EPS) return 1;
     38     else if(x<-EPS) return -1;
     39     return 0;
     40 }
     41 
     42 inline double cross(PO &a,PO &b,PO &c)
     43 {
     44     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
     45 }
     46 
     47 inline double getarea(PO *a,int n)//多边形面积,逆时针为正 
     48 {
     49     double res=0.0;
     50     for(int i=1;i<=n;i++) res+=cross(o,a[i],a[i+1]);
     51     return res*0.5;
     52 }
     53 
     54 inline PO getpoint(PO &a,PO &b,PO &c,PO &d)//直线交点 
     55 {
     56     PO ans,tp=b-a;
     57     double k1=cross(a,d,c);
     58     double k2=cross(b,c,d);
     59     ans.x=a.x+tp.x*k1/(k1+k2);
     60     ans.y=a.y+tp.y*k1/(k1+k2);
     61     return ans;
     62 }
     63 
     64 inline void change()//变顺时针为逆时针 
     65 {
     66     for(int i=1;i<=(n>>1);i++) swap(p[i],p[n-i+1]);
     67     p[n+1]=p[1];
     68 }
     69 
     70 void prt(PO a)
     71 {
     72     printf("%lf   %lf\n",a.x,a.y);
     73 }
     74 
     75 inline void getcut()
     76 {
     77     tp[1].x=tp[5].x=-INF,tp[1].y=tp[5].y=-INF;
     78     tp[2].x=INF,tp[2].y=-INF;
     79     tp[3].x=INF,tp[3].y=INF;
     80     tp[4].x=-INF,tp[4].y=INF;
     81     int cp=4,tc;
     82     for(int i=1;i<=n;i++)
     83     {
     84         tc=0;
     85         for(int j=1;j<=cp;j++)
     86         {
     87             if(dc(cross(p[i],p[i+1],tp[j]))>=0) s[++tc]=tp[j];
     88             if(dc(cross(p[i],p[i+1],tp[j])*cross(p[i],p[i+1],tp[j+1]))<0)
     89                 s[++tc]=getpoint(p[i],p[i+1],tp[j],tp[j+1]);
     90         }
     91         s[tc+1]=s[1];
     92         for(int j=1;j<=tc+1;j++) tp[j]=s[j];
     93         cp=tc;
     94     }
     95     n=cp;
     96 }
     97 
     98 inline void go()
     99 {
    100     change();
    101     getcut();
    102     if(n) printf("Floor #%d\nSurveillance is possible.\n\n",++cas);
    103     else printf("Floor #%d\nSurveillance is impossible.\n\n",++cas);
    104 }
    105 
    106 int main()
    107 {
    108     while(scanf("%d",&n),n) read(),go();
    109     return 0;
    110 }
  • 相关阅读:
    使用SilverLight构建插件式应用程序(九) —聊天插件客户端的实现
    .NET 访问JAVA的WebService使用SOAP头
    使用SilverLight构建插件式应用程序(七)
    管理类软件的界面模板。
    使用SilverLight构建插件式应用程序(六)
    使用SilverLight开发ARPG游戏(一)
    AS 学习笔记 元件和代码的绑定
    scaleform 学习笔记1
    cocos2dx 获取图片的某像素点的RGBA颜色
    接触的第二个引擎 scaleform
  • 原文地址:https://www.cnblogs.com/proverbs/p/2934438.html
Copyright © 2011-2022 走看看