总算是AC了一道计算几何了,高兴之余也是感慨万千啊,总算是突破了,呵呵!
题目大意就是给你两个矩形,大的套小的,保证不会出现交叉的状况,然后还给你了一些线段,让你计算夹在两个矩形之间的线段的总长。由于是第一次写计算几何的题目,写的不是很优越,其实可以在很短的代码量就写出来的,被我硬生生的弄的这么长了,唉,以后在改进了。我用的方法是大矩形里的线段长减去小矩形里的线段长。但是如果用四个矩形(大矩形被小矩形分割成了四个小矩形)的里的线段长相加求和的话,代码量会少很多。
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #define N 2000
- #define INF 100000000
- using namespace std;
- double abs(double x)
- {
- return x<0?(-x):x;
- }
- void zhihuan(int *x1,int *y1)
- {
- int x=*x1;
- *x1=*y1;
- *y1=x;
- }
- int min(int a,int b)
- {
- return a<b?a:b;
- }
- int max(int a,int b)
- {
- return a>b?a:b;
- }
- double out(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
- {
- if(x3>x4)
- {
- zhihuan(&x3,&x4);
- zhihuan(&y3,&y4);
- }
- if(y3>y4)
- {
- x1=0-x1;
- x2=0-x2;
- x3=0-x3;
- x4=0-x4;
- zhihuan(&x3,&x4);
- zhihuan(&y3,&y4);
- int c=x1;
- x1=x2;
- x2=c;
- }
- if(x3==x4)
- {
- if(x3>=x2 || x4<=x1) return 0.0;
- if(y3>=y2 || y4<=y1) return 0.0;
- return min(y2,y4)-max(y1,y3);
- }
- if(y3==y4)
- {
- if(y3>=y2 || y3<=y1) return 0.0;
- if(x3>=x2 || x4<=x1) return 0.0;
- return min(x2,x4)-max(x1,x3);
- }
- if(x3>=x2 || x4<=x1 || y3>=y2 || y4<=y1) return 0.0;
- double k1=((double)(y4-y3))/(x4-x3)*(x1-x3)+y3;
- double k4=((double)(y4-y3))/(x4-x3)*(x2-x3)+y3;
- double k2=((double)(x4-x3))/(y4-y3)*(y1-y3)+x3;
- double k3=((double)(x4-x3))/(y4-y3)*(y2-y3)+x3;
- if(x3>=x1 && y3>=y1 && x4<=x2 && y4<=y2) return sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
- if(k1<y2 && k1>y1 && x3<=x1)
- {
- if(x4<=x2 && y4<=y2 && x4>=x1 && y4>=y1) return sqrt((x4-x1)*(x4-x1)+(y4-k1)*(y4-k1));
- if(k3>x1 && k3<x2) return sqrt((k3-x1)*(k3-x1)+(y2-k1)*(y2-k1));
- if(k4>y1 && k4<=y2) return sqrt((x2-x1)*(x2-x1)+(k4-k1)*(k4-k1));
- }
- else if(k2>=x1 && k2<x2 && x3<=k2)
- {
- if(x4<=x2 && y4<=y2 && x4>=x1 && y4>=y1) return sqrt((x4-k2)*(x4-k2)+(y4-y1)*(y4-y1));
- if(k3>x1 && k3<x2) return sqrt((k3-k2)*(k3-k2)+(y2-y1)*(y2-y1));
- if(k4>y1 && k4<=y2) return sqrt((x2-k2)*(x2-k2)+(k4-y1)*(k4-y1));
- }
- else if(k3>x1 && k3<x2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((k3-x3)*(k3-x3)+(y2-y3)*(y2-y3));
- else if(k4>y1 && k4<=y2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((x2-x3)*(x2-x3)+(k4-y3)*(k4-y3));
- else return 0.0;
- }
- double in(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int xx1,int yy1,int xx2,int yy2)
- {
- if(x3>x4)
- {
- zhihuan(&x3,&x4);
- zhihuan(&y3,&y4);
- }
- if(y3>y4)
- {
- x1=0-x1;
- x2=0-x2;
- x3=0-x3;
- x4=0-x4;
- zhihuan(&x3,&x4);
- zhihuan(&y3,&y4);
- int c=x1;
- x1=x2;
- x2=c;
- }
- if(x3==x4)
- {
- if(x3>x2 || x4<x1) return 0.0;
- if(x3==x2 && x2==xx2) return 0.0;
- if(x3==x1 && x1==xx1) return 0.0;
- if(y3>=y2 || y4<=y1) return 0.0;
- return min(y2,y4)-max(y1,y3);
- }
- if(y3==y4)
- {
- if(y3>y2 || y3<y1) return 0.0;
- if(y3==y2 && y2==yy2) return 0.0;
- if(y3==y1 && y1==yy1) return 0.0;
- if(x3>x2 || x4<x1) return 0.0;
- return min(x2,x4)-max(x1,x3);
- }
- if(x3>=x2 || x4<=x1 || y3>=y2 || y4<=y1) return 0.0;
- double k1=((double)(y4-y3))/(x4-x3)*(x1-x3)+y3;
- double k4=((double)(y4-y3))/(x4-x3)*(x2-x3)+y3;
- double k2=((double)(x4-x3))/(y4-y3)*(y1-y3)+x3;
- double k3=((double)(x4-x3))/(y4-y3)*(y2-y3)+x3;
- if(x3>=x1 && y3>=y1 && x4<=x2 && y4<=y2) return sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
- if(k1<y2 && k1>y1 && x1>=x3)
- {
- if(x4<=x2 && y4<=y2) return sqrt((x4-x1)*(x4-x1)+(y4-k1)*(y4-k1));
- if(k3>x1 && k3<x2) return sqrt((k3-x1)*(k3-x1)+(y2-k1)*(y2-k1));
- if(k4>y1 && k4<=y2) return sqrt((x2-x1)*(x2-x1)+(k4-k1)*(k4-k1));
- }
- else if(k2>=x1 && k2<x2 && k2>=x3)
- {
- if(x4<=x2 && y4<=y2) return sqrt((x4-k2)*(x4-k2)+(y4-y1)*(y4-y1));
- if(k3>x1 && k3<x2) return sqrt((k3-k2)*(k3-k2)+(y2-y1)*(y2-y1));
- if(k4>y1 && k4<=y2) return sqrt((x2-k2)*(x2-k2)+(k4-y1)*(k4-y1));
- }
- else if(k3>x1 && k3<x2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((k3-x3)*(k3-x3)+(y2-y3)*(y2-y3));
- else if(k4>y1 && k4<=y2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((x2-x3)*(x2-x3)+(k4-y3)*(k4-y3));
- else return 0.0;
- }
- int main()
- {
- int t,n;
- scanf("%d",&t);
- for(int ca=1;ca<=t;ca++)
- {
- int px,py,l1,w1,qx,qy,l2,w2;
- scanf("%d%d%d%d%d%d%d%d%d",&px,&py,&l1,&w1,&qx,&qy,&l2,&w2,&n);
- if(px>qx)
- {
- zhihuan(&px,&qx);
- zhihuan(&py,&qy);
- zhihuan(&l1,&l2);
- zhihuan(&w1,&w2);
- }
- double ans=0.0;
- for(int i=1;i<=n;i++)
- {
- int x3,x4,y3,y4;
- scanf("%d%d%d%d",&x3,&y3,&x4,&y4);
- double k1=out(px,py,px+l1,py+w1,x3,y3,x4,y4);
- double k2=in(qx,qy,qx+l2,qy+w2,x3,y3,x4,y4,px,py,px+l1,py+w1);
- ans+=k1-k2;
- }
- printf("Case #%d: %.2lf\n",ca,ans);
- }
- return 0;
- }