圆形与矩形截面的面积

三角仍然可以做到这一点

代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const double eps = 1e-8;
  9. const double pi = acos(-1.0);
  10.  
  11. int dcmp(double x)
  12. {
  13. if(x > eps) return 1;
  14. return x < -eps ? -1 : 0;
  15. }
  16.  
  17. struct Point
  18. {
  19. double x, y;
  20. Point(){x = y = 0;}
  21. Point(double a, double b)
  22. {x = a, y = b;}
  23. inline void read()
  24. {scanf("%lf%lf", &x, &y);}
  25. inline Point operator-(const Point &b)const
  26. {return Point(x - b.x, y - b.y);}
  27. inline Point operator+(const Point &b)const
  28. {return Point(x + b.x, y + b.y);}
  29. inline Point operator*(const double &b)const
  30. {return Point(x * b, y * b);}
  31. inline double dot(const Point &b)const
  32. {return x * b.x + y * b.y;}
  33. inline double cross(const Point &b, const Point &c)const
  34. {return (b.x - x) * (c.y - y) - (c.x - x) * (b.y - y);}
  35. inline double Dis(const Point &b)const
  36. {return sqrt((*this - b).dot(*this - b));}
  37. inline bool InLine(const Point &b, const Point &c)const//三点共线
  38. {return !dcmp(cross(b, c));}
  39. inline bool OnSeg(const Point &b, const Point &c)const//点在线段上,包含端点
  40. {return InLine(b, c) && (*this - c).dot(*this - b) < eps;}
  41. };
  42.  
  43. inline double min(double a, double b)
  44. {return a < b ? a : b;}
  45. inline double max(double a, double b)
  46. {return a > b ? a : b;}
  47. inline double Sqr(double x)
  48. {return x * x;}
  49. inline double Sqr(const Point &p)
  50. {return p.dot(p);}
  51.  
  52. Point LineCross(const Point &a, const Point &b, const Point &c, const Point &d)
  53. {
  54. double u = a.cross(b, c), v = b.cross(a, d);
  55. return Point((c.x * v + d.x * u) / (u + v), (c.y * v + d.y * u) / (u + v));
  56. }
  57.  
  58. double LineCrossCircle(const Point &a, const Point &b, const Point &r,
  59. double R, Point &p1, Point &p2)
  60. {
  61. Point fp = LineCross(r, Point(r.x + a.y - b.y, r.y + b.x - a.x), a, b);
  62. double rtol = r.Dis(fp);
  63. double rtos = fp.OnSeg(a, b) ?
  64.  
  65. rtol : min(r.Dis(a), r.Dis(b));
  66. double atob = a.Dis(b);
  67. double fptoe = sqrt(R * R - rtol * rtol) / atob;
  68. if(rtos > R - eps) return rtos;
  69. p1 = fp + (a - b) * fptoe;
  70. p2 = fp + (b - a) * fptoe;
  71. return rtos;
  72. }
  73.  
  74. double SectorArea(const Point &r, const Point &a, const Point &b, double R)
  75. //不大于180度扇形面积。r->a->b逆时针
  76. {
  77. double A2 = Sqr(r - a), B2 = Sqr(r - b), C2 = Sqr(a - b);
  78. return R * R * acos((A2 + B2 - C2) * 0.5 / sqrt(A2) / sqrt(B2)) * 0.5;
  79. }
  80.  
  81. double TACIA(const Point &r, const Point &a, const Point &b, double R)
  82. //TriangleAndCircleIntersectArea。逆时针,r为圆心
  83. {
  84. double adis = r.Dis(a), bdis = r.Dis(b);
  85. if(adis < R + eps && bdis < R + eps) return r.cross(a, b) * 0.5;
  86. Point ta, tb;
  87. if(r.InLine(a, b)) return 0.0;
  88. double rtos = LineCrossCircle(a, b, r, R, ta, tb);
  89. if(rtos > R - eps) return SectorArea(r, a, b, R);
  90. if(adis < R + eps) return r.cross(a, tb) * 0.5 + SectorArea(r, tb, b, R);
  91. if(bdis < R + eps) return r.cross(ta, b) * 0.5 + SectorArea(r, a, ta, R);
  92. return r.cross(ta, tb) * 0.5 +
  93. SectorArea(r, a, ta, R) + SectorArea(r, tb, b, R);
  94. }
  95.  
  96. const int N = 505;
  97.  
  98. Point p[N], o;
  99.  
  100. double SPICA(int n, Point r, double R)//SimplePolygonIntersectCircleArea
  101. {
  102. int i;
  103. double res = 0, if_clock_t;
  104. for(i = 0; i < n; ++ i)
  105. {
  106. if_clock_t = dcmp(r.cross(p[i], p[(i + 1) % n]));
  107. if(if_clock_t < 0) res -= TACIA(r, p[(i + 1) % n], p[i], R);
  108. else res += TACIA(r, p[i], p[(i + 1) % n], R);
  109. }
  110. return fabs(res);
  111. }
  112.  
  113. double r;
  114.  
  115. int main() {
  116. int bo = 0;
  117. while (~scanf("%lf%lf%lf", &o.x, &o.y, &r)) {
  118. if (bo) printf("\n");
  119. else bo = 1;
  120. double x1, y1, x2, y2;
  121. scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
  122. if (x1 > x2) swap(x1, x2);
  123. if (y1 > y2) swap(y1, y2);
  124. p[0] = Point(x1, y1);
  125. p[1] = Point(x1, y2);
  126. p[2] = Point(x2, y2);
  127. p[3] = Point(x2, y1);
  128. printf("%.10f\n", SPICA(4, o, r));
  129. }
  130. return 0;
  131. }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

ZOJ 2675 Little Mammoth(计算几何)的更多相关文章

  1. ZOJ 1696 Viva Confetti 计算几何

    计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...

  2. zoj 3537 区间dp+计算几何

    题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...

  3. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  4. July 【补题】

    A(zoj 3596) bfs,记忆搜都可以, 按余数来记录状态. B(zoj 3599) 博弈,跳过 C(zoj 3592) 简单dp,题意不好懂 D(zoj 3602) 子树哈希, 对根的左右儿子 ...

  5. ZOJ 3157 Weapon --计算几何+树状数组

    题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...

  6. ZOJ 3203 Light Bulb (三分+计算几何)

    B - Light Bulb Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  7. ZOJ 1081 Within(点是否在多边形内)| 计算几何

    ZOJ 1081 Within 我使用的是"射线法":从该点出发,作一条向左的水平射线,与多边形的边的交点有奇数个则点在多边形内. 需要注意的点: 如果点在多边形的边上特判. 考虑 ...

  8. zoj 1081:Points Within(计算几何,判断点是否在多边形内,经典题)

    Points Within Time Limit: 2 Seconds      Memory Limit: 65536 KB Statement of the Problem Several dra ...

  9. zoj 3716 Ribbon Gymnastics【神奇的计算几何】

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3716 来源:http://acm.hust.edu.cn/vjudg ...

随机推荐

  1. [Android 4.4.4] 泛泰A870 通过刷第三版 Mokee4.4.4 KTU84P 20140626 RC2.1 by syhost

    主题及注意事项请访问以前的版本: http://blog.csdn.net/syhost/article/details/29931291 此RC2.1版比RC2.0改进的地方: 1. Mokee本身 ...

  2. STM32F4xx时钟理解

    理解力STM32时钟是我们的应用定时器等的基础,据总结近期工作: 以下是一STM32时钟树: 1.首先注意的的是图中画绿色圈圈的两个,HSE和HSI分别表示外部时钟和内部时钟,当中HSE 是是快速外部 ...

  3. MysqL的root用户不允许远程连接

    原文:MysqL的root用户不允许远程连接 今天程序报了异常:java.sql.SQLException: Access denied for user 'root'@'RJB-Z' (using ...

  4. javascript中间preventDefault与stopPropagation角色介绍

    preventDefault的作用是什么方法,它? 我们知道,例如,<a href="http://www.baidu.com">百度</a>,这是html ...

  5. rm-rf 恢复过程中滥用

    多DBA一定rm -rf讨厌它,也许有一天自己将数据库,以消除一个中午,然后.那么就没有一个--这种情况下,--这个不幸真的发生,你真的无药可救?不必要,有解决方法.也许你遇到不幸时,有一天.你可以用 ...

  6. k8s with flanneld

    三台机器 kmaster 192.168.1.201 kslave202 192.168.1.202 kslave203 192.168.1.203 安装好k8s 1. 在Node机器上安装flann ...

  7. NSIS:简单按钮美化插件SkinButton,支持透明PNG图片。

    原文 NSIS:简单按钮美化插件SkinButton,支持透明PNG图片. 征得作者贾可的同意,特发布按钮美化插件SkinButton. 插件说明: 使用GDI+库写的一个简单按钮美化插件,支持透明P ...

  8. 采用shell脚本统计代码的行数

    刚毕业那会儿有一次去台湾公司面试,我问多行代码怎么写.我从来没有想过这个问题,粗略计算,.惊叹:大概几十万行不行. 最近整理资料,看着eclipse左边全面上市,我觉得这个东西.代码共同拥有的行倒底总 ...

  9. 前端插件@user

    分享一个 @user 前端插件   开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是 ...

  10. SharePoint 2010 中创建超链接到Pop-Up对话框

    SharePoint 2010 中创建超链接到Pop-Up对话框         SharePoint 2010 推出了新式的带有阴影的弹出对话框,你感觉怎么样?我感觉倒是挺酷的.这样少打开了一个页面 ...