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

 

你可能感兴趣的:(poj)