ZOJ 2675 Little Mammoth(计算几何)
圆形与矩形截面的面积
三角仍然可以做到这一点
代码:
#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(计算几何)相关推荐
- zoj 2675 Little Mammoth 圆与四边形的公共面积
题目地址:zoj2675 和上面两题完全一样的,额,话说去年暑假集训的时候没人做出来啊. 额,zoj 的g++对long double 的支持还是很好的 代码: #include<iostrea ...
- ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...
- ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- POJ 计算几何入门题目推荐
其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...
- 计算几何相关资料+题目推荐(不定期补充)
旋转卡壳:http://blog.csdn.net/accry/article/details/6070626 计算几何题目推荐:http://blog.csdn.net/accry/article/ ...
- 计算几何问题 java_【转载】ACM计算几何题目推荐
2107 Quoit Design 典型最近点对问题 POJ 3714 Raid 变种最近点对问题 B,最小包围圆 最小包围圆的算法是一种增量算法,期望是O(n). ZO ...
- poj计算几何题推荐
POJ 计算几何入门题目推荐(转) 其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...
- acm 计算几何题目集合
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
最新文章
- OpenCV | 分水岭算法进行图像分割
- python 对话框的创建及调用_Python 使用 PyQt 自定义对话框
- redis安装 redis命令 php如何使用redis
- 【微信小程序企业级开发教程】小程序的配置详解
- 笔记本网络计算机和设备不可见,WIN10局域网电脑和设备显示不完整
- 计算机科学个人陈述,计算机专业个人陈述样本
- 简单的面试题简解思路(搜集)
- 定时器控件timer winform 114869229
- npm/yarn修改全局安装路径和缓存路径。。。
- 华为Mate 40系列或首发屏下摄像头:全球首个量产级别方案
- Unity3D的音效相关介绍
- Vue 引入 zepto
- h5打开app指定页面,有则打开,无则下载
- 从零开始学java系列第一季第一期:简单的了解java并安装jdk以及环境配置
- 毕业设计-基于汇编语言的at89c52单片机可调数字钟的设计,基于AT89S52单片机数字钟的仿真设计(汇编语言程序)...
- 【OpenCV】—ROI区域图像叠加图像混合
- 中小型互联网公司技术研发部门组织架构及职责
- 2019互联网行业面试资料合集
- 我的世界服务器拔刀修复,我的世界拔刀剑怎么修复武器攻略分享
- Remmina无法远程连接的解决方法
热门文章
- 网站bin目录下的不可以放配置文件或其他可写文件
- tpp letter
- bank holiday in uk 2020
- the next journal submission for mechanism should be at this journal
- 明天mbzuai面试的准备,严阵以待
- 2018.8.5 复习笔记
- 20189211 《网络攻防》第五周作业
- 在不进入Guest OS的情况下,取得Guest OS的IP地址
- Angularjs Controller 间通信机制
- Backbone React Requirejs 应用实战(一)——RequireJS管理React依赖