poj2540Hotter Colder(半平面交)

链接

根据距离可以列得直线方程,附上初始矩形的四个顶点,依次用直线切割。

  1 #include<iostream>
  2 #include <stdio.h>
  3 #include <math.h>
  4 #include<cstring>
  5 #include<algorithm>
  6 #define eps 1e-8
  7 using namespace std;
  8 const int MAXN=1550;
  9 int m;
 10 double r,tx,ty,ans;
 11 int cCnt,curCnt;//此时cCnt为最终切割得到的多边形的顶点数、暂存顶点个数
 12 struct point
 13 {
 14     double x,y;
 15     point(double x=0,double y=0):x(x),y(y) {}
 16 };
 17 point points[MAXN],p[MAXN],q[MAXN];//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点
 18 void getline(point x,point y,double &a,double &b,double   &c) //两点x、y确定一条直线a、b、c为其系数
 19 {
 20     a = y.y - x.y;
 21     b = x.x - y.x;
 22     c = y.x * x.y - x.x * y.y;
 23 }
 24 void initial()
 25 {
 26     for(int i = 1; i <= m; ++i)p[i] = points[i];
 27     p[m+1] = p[1];
 28     p[0] = p[m];
 29     cCnt = m;//cCnt为最终切割得到的多边形的顶点数,将其初始化为多边形的顶点的个数
 30 }
 31 point intersect(point x,point y,double a,double b,double c) //求x、y形成的直线与已知直线a、b、c、的交点
 32 {
 33     //cout<<a<<" "<<b<<" "<<c<<endl;
 34     double u = fabs(a * x.x + b * x.y + c);
 35     double v = fabs(a * y.x + b * y.y + c);
 36     // cout<<u<<" "<<v<<endl;
 37     point pt;
 38     pt.x=(x.x * v + y.x * u) / (u + v);
 39     pt.y=(x.y * v + y.y * u) / (u + v);//cout<<pt.x<<" -"<<pt.y<<" "<<x.x<<" "<<y.x<<endl;
 40     return  pt;
 41 }
 42 void cut(double a,double b ,double c)
 43 {
 44     curCnt = 0;
 45     for(int i = 1; i <= cCnt; ++i)
 46     {
 47         if(a*p[i].x + b*p[i].y + c > -eps)q[++curCnt] = p[i];
 48         else
 49         {
 50             if(a*p[i-1].x + b*p[i-1].y + c > eps)
 51             {
 52                 q[++curCnt] = intersect(p[i-1],p[i],a,b,c);
 53             }
 54             if(a*p[i+1].x + b*p[i+1].y + c > eps) //原理同上
 55             {
 56                 q[++curCnt] = intersect(p[i],p[i+1],a,b,c);
 57             }
 58         }
 59         //cout<<q[curCnt].x<<" --"<<q[curCnt].y<<" "<<i<<" "<<p[i].x<<" "<<p[i].y<<endl;
 60     }
 61     for(int i = 1; i <= curCnt; ++i)p[i] = q[i];
 62     p[curCnt+1] = q[1];
 63     p[0] = p[curCnt];
 64     cCnt = curCnt;
 65 }
 66 int dcmp(double x)
 67 {
 68     if(fabs(x)<eps) return 0;
 69     return x<0?-1:1;
 70 }
 71 void solve(double x,double y,int flag)
 72 {
 73     double a,b,c;
 74     if(flag == 1)
 75     {
 76         a = -2*x+2*tx,b = -2*y+2*ty,c = x*x+y*y-tx*tx-ty*ty;
 77     }
 78     else if(flag==2)
 79     {
 80         a = 2*x-2*tx,b = 2*y-2*ty,c = tx*tx+ty*ty-x*x-y*y;
 81     }
 82 //    if(dcmp(a)==0&&dcmp(b)==0&&dcmp(c)<=0)
 83 //    {
 84 //        ans = 0;
 85 //        return ;
 86 //    }
 87     cut(a,b,c);
 88 }
 89 int main()
 90 {
 91     points[1] = point(0,0);
 92     points[2] = point(0,10);
 93     points[3] = point(10,10);
 94     points[4] = point(10,0);
 95     p[5] = p[1];
 96     m = 4;
 97     tx = 0,ty=0;
 98     char s[10];
 99     double x,y;
100     initial();
101     while(scanf("%lf%lf%s",&x,&y,s)!=EOF)
102     {
103         int flag;
104         if(strcmp(s,"Colder")==0||strcmp(s,"Same")==0)solve(x,y,1);
105         if(strcmp(s,"Hotter")==0||strcmp(s,"Same")==0)solve(x,y,2);
106         tx = x,ty=y;
107         double area = 0;
108         for(int i = 1; i <= cCnt; ++i)
109         {
110             //cout<<p[i].x<<" "<<p[i].y<<endl;
111             area += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y;
112         }
113         area = fabs(area / 2.0);
114         ans = area;
115         printf("%.2f\n",ans);
116     }
117 }
View Code

 

posted @ 2014-08-04 08:39  _雨  阅读(292)  评论(0编辑  收藏  举报