Darwin(我的第一道计算几何题)

    总算是AC了一道计算几何了,高兴之余也是感慨万千啊,总算是突破了,呵呵!

        题目原文

    题目大意就是给你两个矩形,大的套小的,保证不会出现交叉的状况,然后还给你了一些线段,让你计算夹在两个矩形之间的线段的总长。由于是第一次写计算几何的题目,写的不是很优越,其实可以在很短的代码量就写出来的,被我硬生生的弄的这么长了,唉,以后在改进了。我用的方法是大矩形里的线段长减去小矩形里的线段长。但是如果用四个矩形(大矩形被小矩形分割成了四个小矩形)的里的线段长相加求和的话,代码量会少很多。

  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<cstdio>  
  4. #include<algorithm>  
  5. #include<cmath>  
  6. #define N 2000  
  7. #define INF 100000000  
  8. using namespace std;  
  9. double abs(double x)  
  10. {  
  11.     return x<0?(-x):x;  
  12. }  
  13. void zhihuan(int *x1,int *y1)  
  14. {  
  15.     int x=*x1;  
  16.     *x1=*y1;  
  17.     *y1=x;  
  18. }  
  19. int min(int a,int b)  
  20. {  
  21.     return a<b?a:b;  
  22. }  
  23. int max(int a,int b)  
  24. {  
  25.     return a>b?a:b;  
  26. }  
  27. double out(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)  
  28. {  
  29.     if(x3>x4)  
  30.     {  
  31.         zhihuan(&x3,&x4);  
  32.         zhihuan(&y3,&y4);  
  33.     }  
  34.     if(y3>y4)  
  35.     {  
  36.         x1=0-x1;  
  37.         x2=0-x2;  
  38.         x3=0-x3;  
  39.         x4=0-x4;  
  40.         zhihuan(&x3,&x4);  
  41.         zhihuan(&y3,&y4);  
  42.         int c=x1;  
  43.         x1=x2;  
  44.         x2=c;  
  45.     }  
  46.     if(x3==x4)  
  47.     {  
  48.         if(x3>=x2 || x4<=x1) return 0.0;  
  49.         if(y3>=y2 || y4<=y1) return 0.0;  
  50.         return min(y2,y4)-max(y1,y3);  
  51.     }  
  52.     if(y3==y4)  
  53.     {  
  54.         if(y3>=y2 || y3<=y1) return 0.0;  
  55.         if(x3>=x2 || x4<=x1) return 0.0;  
  56.         return min(x2,x4)-max(x1,x3);  
  57.     }  
  58.     if(x3>=x2 || x4<=x1 || y3>=y2 || y4<=y1) return 0.0;  
  59.     double k1=((double)(y4-y3))/(x4-x3)*(x1-x3)+y3;  
  60.     double k4=((double)(y4-y3))/(x4-x3)*(x2-x3)+y3;  
  61.     double k2=((double)(x4-x3))/(y4-y3)*(y1-y3)+x3;  
  62.     double k3=((double)(x4-x3))/(y4-y3)*(y2-y3)+x3;  
  63.     if(x3>=x1 && y3>=y1 && x4<=x2 && y4<=y2) return sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));  
  64.     if(k1<y2 && k1>y1 && x3<=x1)  
  65.     {  
  66.         if(x4<=x2 && y4<=y2 && x4>=x1 && y4>=y1) return sqrt((x4-x1)*(x4-x1)+(y4-k1)*(y4-k1));  
  67.         if(k3>x1 && k3<x2) return sqrt((k3-x1)*(k3-x1)+(y2-k1)*(y2-k1));  
  68.         if(k4>y1 && k4<=y2) return sqrt((x2-x1)*(x2-x1)+(k4-k1)*(k4-k1));  
  69.     }  
  70.     else if(k2>=x1 && k2<x2 && x3<=k2)  
  71.     {  
  72.         if(x4<=x2 && y4<=y2 && x4>=x1 && y4>=y1) return sqrt((x4-k2)*(x4-k2)+(y4-y1)*(y4-y1));  
  73.         if(k3>x1 && k3<x2) return sqrt((k3-k2)*(k3-k2)+(y2-y1)*(y2-y1));  
  74.         if(k4>y1 && k4<=y2) return sqrt((x2-k2)*(x2-k2)+(k4-y1)*(k4-y1));  
  75.     }  
  76.     else if(k3>x1 && k3<x2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((k3-x3)*(k3-x3)+(y2-y3)*(y2-y3));  
  77.     else if(k4>y1 && k4<=y2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((x2-x3)*(x2-x3)+(k4-y3)*(k4-y3));  
  78.     else return 0.0;  
  79. }  
  80. 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)  
  81. {  
  82.     if(x3>x4)  
  83.     {  
  84.         zhihuan(&x3,&x4);  
  85.         zhihuan(&y3,&y4);  
  86.     }  
  87.     if(y3>y4)  
  88.     {  
  89.         x1=0-x1;  
  90.         x2=0-x2;  
  91.         x3=0-x3;  
  92.         x4=0-x4;  
  93.         zhihuan(&x3,&x4);  
  94.         zhihuan(&y3,&y4);  
  95.         int c=x1;  
  96.         x1=x2;  
  97.         x2=c;  
  98.     }  
  99.     if(x3==x4)  
  100.     {  
  101.         if(x3>x2 || x4<x1) return 0.0;  
  102.         if(x3==x2 && x2==xx2) return 0.0;  
  103.         if(x3==x1 && x1==xx1) return 0.0;  
  104.         if(y3>=y2 || y4<=y1) return 0.0;  
  105.         return min(y2,y4)-max(y1,y3);  
  106.     }  
  107.     if(y3==y4)  
  108.     {  
  109.         if(y3>y2 || y3<y1) return 0.0;  
  110.         if(y3==y2 && y2==yy2) return 0.0;  
  111.         if(y3==y1 && y1==yy1) return 0.0;  
  112.         if(x3>x2 || x4<x1) return 0.0;  
  113.         return min(x2,x4)-max(x1,x3);  
  114.     }  
  115.     if(x3>=x2 || x4<=x1 || y3>=y2 || y4<=y1) return 0.0;  
  116.     double k1=((double)(y4-y3))/(x4-x3)*(x1-x3)+y3;  
  117.     double k4=((double)(y4-y3))/(x4-x3)*(x2-x3)+y3;  
  118.     double k2=((double)(x4-x3))/(y4-y3)*(y1-y3)+x3;  
  119.     double k3=((double)(x4-x3))/(y4-y3)*(y2-y3)+x3;  
  120.     if(x3>=x1 && y3>=y1 && x4<=x2 && y4<=y2) return sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));  
  121.     if(k1<y2 && k1>y1 && x1>=x3)  
  122.     {  
  123.         if(x4<=x2 && y4<=y2) return sqrt((x4-x1)*(x4-x1)+(y4-k1)*(y4-k1));  
  124.         if(k3>x1 && k3<x2) return sqrt((k3-x1)*(k3-x1)+(y2-k1)*(y2-k1));  
  125.         if(k4>y1 && k4<=y2) return sqrt((x2-x1)*(x2-x1)+(k4-k1)*(k4-k1));
  126.     }  
  127.     else if(k2>=x1 && k2<x2 && k2>=x3)  
  128.     {  
  129.         if(x4<=x2 && y4<=y2) return sqrt((x4-k2)*(x4-k2)+(y4-y1)*(y4-y1));  
  130.         if(k3>x1 && k3<x2) return sqrt((k3-k2)*(k3-k2)+(y2-y1)*(y2-y1));  
  131.         if(k4>y1 && k4<=y2) return sqrt((x2-k2)*(x2-k2)+(k4-y1)*(k4-y1));
  132.     }  
  133.     else if(k3>x1 && k3<x2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((k3-x3)*(k3-x3)+(y2-y3)*(y2-y3));  
  134.     else if(k4>y1 && k4<=y2 && x3>=x1 && x3<=x2 && y3>=y1 && y3<=y2) return sqrt((x2-x3)*(x2-x3)+(k4-y3)*(k4-y3));  
  135.     else return 0.0;  
  136. }  
  137. int main()  
  138. {
  139.     int t,n;  
  140.     scanf("%d",&t);  
  141.     for(int ca=1;ca<=t;ca++)  
  142.     {  
  143.         int px,py,l1,w1,qx,qy,l2,w2;  
  144.         scanf("%d%d%d%d%d%d%d%d%d",&px,&py,&l1,&w1,&qx,&qy,&l2,&w2,&n);  
  145.         if(px>qx)  
  146.         {  
  147.             zhihuan(&px,&qx);  
  148.             zhihuan(&py,&qy);  
  149.             zhihuan(&l1,&l2);  
  150.             zhihuan(&w1,&w2);  
  151.         }  
  152.         double ans=0.0;  
  153.         for(int i=1;i<=n;i++)  
  154.         {  
  155.             int x3,x4,y3,y4;  
  156.             scanf("%d%d%d%d",&x3,&y3,&x4,&y4);  
  157.             double k1=out(px,py,px+l1,py+w1,x3,y3,x4,y4);  
  158.             double k2=in(qx,qy,qx+l2,qy+w2,x3,y3,x4,y4,px,py,px+l1,py+w1);
  159.             ans+=k1-k2;  
  160.         }  
  161.         printf("Case #%d: %.2lf\n",ca,ans);  
  162.     }  
  163.     return 0;  
  164. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值