首页 > 代码库 > poj2540Hotter Colder(半平面交)
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。