圆形与矩形截面的面积

三角仍然可以做到这一点

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;const double eps = 1e-8;
const double pi = acos(-1.0);int dcmp(double x)
{if(x > eps) return 1;return x < -eps ? -1 : 0;
}struct Point
{double x, y;Point(){x = y = 0;}Point(double a, double b){x = a, y = b;}inline void read(){scanf("%lf%lf", &x, &y);}inline Point operator-(const Point &b)const{return Point(x - b.x, y - b.y);}inline Point operator+(const Point &b)const{return Point(x + b.x, y + b.y);}inline Point operator*(const double &b)const{return Point(x * b, y * b);}inline double dot(const Point &b)const{return x * b.x + y * b.y;}inline double cross(const Point &b, const Point &c)const{return (b.x - x) * (c.y - y) - (c.x - x) * (b.y - y);}inline double Dis(const Point &b)const{return sqrt((*this - b).dot(*this - b));}inline bool InLine(const Point &b, const Point &c)const//三点共线{return !dcmp(cross(b, c));}inline bool OnSeg(const Point &b, const Point &c)const//点在线段上,包含端点{return InLine(b, c) && (*this - c).dot(*this - b) < eps;}
};inline double min(double a, double b)
{return a < b ? a : b;}
inline double max(double a, double b)
{return a > b ? a : b;}
inline double Sqr(double x)
{return x * x;}
inline double Sqr(const Point &p)
{return p.dot(p);}Point LineCross(const Point &a, const Point &b, const Point &c, const Point &d)
{double u = a.cross(b, c), v = b.cross(a, d);return Point((c.x * v + d.x * u) / (u + v), (c.y * v + d.y * u) / (u + v));
}double LineCrossCircle(const Point &a, const Point &b, const Point &r,double R, Point &p1, Point &p2)
{Point fp = LineCross(r, Point(r.x + a.y - b.y, r.y + b.x - a.x), a, b);double rtol = r.Dis(fp);double rtos = fp.OnSeg(a, b) ?

rtol : min(r.Dis(a), r.Dis(b)); double atob = a.Dis(b); double fptoe = sqrt(R * R - rtol * rtol) / atob; if(rtos > R - eps) return rtos; p1 = fp + (a - b) * fptoe; p2 = fp + (b - a) * fptoe; return rtos; } double SectorArea(const Point &r, const Point &a, const Point &b, double R) //不大于180度扇形面积。r->a->b逆时针 { double A2 = Sqr(r - a), B2 = Sqr(r - b), C2 = Sqr(a - b); return R * R * acos((A2 + B2 - C2) * 0.5 / sqrt(A2) / sqrt(B2)) * 0.5; } double TACIA(const Point &r, const Point &a, const Point &b, double R) //TriangleAndCircleIntersectArea。逆时针,r为圆心 { double adis = r.Dis(a), bdis = r.Dis(b); if(adis < R + eps && bdis < R + eps) return r.cross(a, b) * 0.5; Point ta, tb; if(r.InLine(a, b)) return 0.0; double rtos = LineCrossCircle(a, b, r, R, ta, tb); if(rtos > R - eps) return SectorArea(r, a, b, R); if(adis < R + eps) return r.cross(a, tb) * 0.5 + SectorArea(r, tb, b, R); if(bdis < R + eps) return r.cross(ta, b) * 0.5 + SectorArea(r, a, ta, R); return r.cross(ta, tb) * 0.5 + SectorArea(r, a, ta, R) + SectorArea(r, tb, b, R); } const int N = 505; Point p[N], o; double SPICA(int n, Point r, double R)//SimplePolygonIntersectCircleArea { int i; double res = 0, if_clock_t; for(i = 0; i < n; ++ i) { if_clock_t = dcmp(r.cross(p[i], p[(i + 1) % n])); if(if_clock_t < 0) res -= TACIA(r, p[(i + 1) % n], p[i], R); else res += TACIA(r, p[i], p[(i + 1) % n], R); } return fabs(res); } double r; int main() { int bo = 0; while (~scanf("%lf%lf%lf", &o.x, &o.y, &r)) { if (bo) printf("\n"); else bo = 1; double x1, y1, x2, y2; scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2); if (x1 > x2) swap(x1, x2); if (y1 > y2) swap(y1, y2); p[0] = Point(x1, y1); p[1] = Point(x1, y2); p[2] = Point(x2, y2); p[3] = Point(x2, y1); printf("%.10f\n", SPICA(4, o, r)); } return 0; }

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

转载于:https://www.cnblogs.com/mengfanrong/p/4752774.html

ZOJ 2675 Little Mammoth(计算几何)相关推荐

  1. zoj 2675 Little Mammoth 圆与四边形的公共面积

    题目地址:zoj2675 和上面两题完全一样的,额,话说去年暑假集训的时候没人做出来啊. 额,zoj 的g++对long double 的支持还是很好的 代码: #include<iostrea ...

  2. ZOJ 1696 Viva Confetti 计算几何

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

  3. ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的 ...

  4. ACM计算几何题目推荐

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

  5. POJ 计算几何入门题目推荐

      其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...

  6. 计算几何相关资料+题目推荐(不定期补充)

    旋转卡壳:http://blog.csdn.net/accry/article/details/6070626 计算几何题目推荐:http://blog.csdn.net/accry/article/ ...

  7. 计算几何问题 java_【转载】ACM计算几何题目推荐

    2107    Quoit Design    典型最近点对问题 POJ    3714    Raid    变种最近点对问题 B,最小包围圆 最小包围圆的算法是一种增量算法,期望是O(n). ZO ...

  8. poj计算几何题推荐

    POJ 计算几何入门题目推荐(转)       其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...

  9. acm 计算几何题目集合

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

最新文章

  1. OpenCV | 分水岭算法进行图像分割
  2. python 对话框的创建及调用_Python 使用 PyQt 自定义对话框
  3. redis安装 redis命令 php如何使用redis
  4. 【微信小程序企业级开发教程】小程序的配置详解
  5. 笔记本网络计算机和设备不可见,WIN10局域网电脑和设备显示不完整
  6. 计算机科学个人陈述,计算机专业个人陈述样本
  7. 简单的面试题简解思路(搜集)
  8. 定时器控件timer winform 114869229
  9. npm/yarn修改全局安装路径和缓存路径。。。
  10. 华为Mate 40系列或首发屏下摄像头:全球首个量产级别方案
  11. Unity3D的音效相关介绍
  12. Vue 引入 zepto
  13. h5打开app指定页面,有则打开,无则下载
  14. 从零开始学java系列第一季第一期:简单的了解java并安装jdk以及环境配置
  15. 毕业设计-基于汇编语言的at89c52单片机可调数字钟的设计,基于AT89S52单片机数字钟的仿真设计(汇编语言程序)...
  16. 【OpenCV】—ROI区域图像叠加图像混合
  17. 中小型互联网公司技术研发部门组织架构及职责
  18. 2019互联网行业面试资料合集
  19. 我的世界服务器拔刀修复,我的世界拔刀剑怎么修复武器攻略分享
  20. Remmina无法远程连接的解决方法

热门文章

  1. 网站bin目录下的不可以放配置文件或其他可写文件
  2. tpp letter
  3. bank holiday in uk 2020
  4. the next journal submission for mechanism should be at this journal
  5. 明天mbzuai面试的准备,严阵以待
  6. 2018.8.5 复习笔记
  7. 20189211 《网络攻防》第五周作业
  8. 在不进入Guest OS的情况下,取得Guest OS的IP地址
  9. Angularjs Controller 间通信机制
  10. Backbone React Requirejs 应用实战(一)——RequireJS管理React依赖