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;
- }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
ZOJ 2675 Little Mammoth(计算几何)的更多相关文章
- ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...
- zoj 3537 区间dp+计算几何
题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- July 【补题】
A(zoj 3596) bfs,记忆搜都可以, 按余数来记录状态. B(zoj 3599) 博弈,跳过 C(zoj 3592) 简单dp,题意不好懂 D(zoj 3602) 子树哈希, 对根的左右儿子 ...
- ZOJ 3157 Weapon --计算几何+树状数组
题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...
- ZOJ 3203 Light Bulb (三分+计算几何)
B - Light Bulb Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...
- ZOJ 1081 Within(点是否在多边形内)| 计算几何
ZOJ 1081 Within 我使用的是"射线法":从该点出发,作一条向左的水平射线,与多边形的边的交点有奇数个则点在多边形内. 需要注意的点: 如果点在多边形的边上特判. 考虑 ...
- zoj 1081:Points Within(计算几何,判断点是否在多边形内,经典题)
Points Within Time Limit: 2 Seconds Memory Limit: 65536 KB Statement of the Problem Several dra ...
- zoj 3716 Ribbon Gymnastics【神奇的计算几何】
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3716 来源:http://acm.hust.edu.cn/vjudg ...
随机推荐
- [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本身 ...
- STM32F4xx时钟理解
理解力STM32时钟是我们的应用定时器等的基础,据总结近期工作: 以下是一STM32时钟树: 1.首先注意的的是图中画绿色圈圈的两个,HSE和HSI分别表示外部时钟和内部时钟,当中HSE 是是快速外部 ...
- MysqL的root用户不允许远程连接
原文:MysqL的root用户不允许远程连接 今天程序报了异常:java.sql.SQLException: Access denied for user 'root'@'RJB-Z' (using ...
- javascript中间preventDefault与stopPropagation角色介绍
preventDefault的作用是什么方法,它? 我们知道,例如,<a href="http://www.baidu.com">百度</a>,这是html ...
- rm-rf 恢复过程中滥用
多DBA一定rm -rf讨厌它,也许有一天自己将数据库,以消除一个中午,然后.那么就没有一个--这种情况下,--这个不幸真的发生,你真的无药可救?不必要,有解决方法.也许你遇到不幸时,有一天.你可以用 ...
- k8s with flanneld
三台机器 kmaster 192.168.1.201 kslave202 192.168.1.202 kslave203 192.168.1.203 安装好k8s 1. 在Node机器上安装flann ...
- NSIS:简单按钮美化插件SkinButton,支持透明PNG图片。
原文 NSIS:简单按钮美化插件SkinButton,支持透明PNG图片. 征得作者贾可的同意,特发布按钮美化插件SkinButton. 插件说明: 使用GDI+库写的一个简单按钮美化插件,支持透明P ...
- 采用shell脚本统计代码的行数
刚毕业那会儿有一次去台湾公司面试,我问多行代码怎么写.我从来没有想过这个问题,粗略计算,.惊叹:大概几十万行不行. 最近整理资料,看着eclipse左边全面上市,我觉得这个东西.代码共同拥有的行倒底总 ...
- 前端插件@user
分享一个 @user 前端插件 开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是 ...
- SharePoint 2010 中创建超链接到Pop-Up对话框
SharePoint 2010 中创建超链接到Pop-Up对话框 SharePoint 2010 推出了新式的带有阴影的弹出对话框,你感觉怎么样?我感觉倒是挺酷的.这样少打开了一个页面 ...