CTU Open Contest 2019 C. Beer Coasters(计算几何)
题意:
给定一个圆的圆心和一个矩形的左下方坐标和右上方坐标, 除圆的半径之外的 666 个数据均
在−1000-1000−1000 到 100010001000 范围内, 圆的半径在 111 到 100010001000 范围。 求圆与矩形相交的面积。
计算几何,求圆和凸多边形的相交面积模板。
AC代码:
#include <bits/stdc++.h>
#define inf 1000000000000
#define M 100009
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;
struct Point
{double x, y;Point() {}Point(double xx, double yy){x = xx;y = yy;}Point operator-(Point s) { return Point(x - s.x, y - s.y); }Point operator+(Point s) { return Point(x + s.x, y + s.y); }double operator*(Point s) { return x * s.x + y * s.y; }double operator^(Point s) { return x * s.y - y * s.x; }
} p[M];
double max(double a, double b) { return a > b ? a : b; }
double min(double a, double b) { return a < b ? a : b; }
double len(Point a) { return sqrt(a * a); }
double dis(Point a, Point b) { return len(b - a); } //Á½µãÖ®¼äµÄ¾àÀë
double cross(Point a, Point b, Point c) //²æ³Ë
{return (b - a) ^ (c - a);
}
double dot(Point a, Point b, Point c) //µã³Ë
{return (b - a) * (c - a);
}
int judge(Point a, Point b, Point c) //ÅжÏcÊÇ·ñÔÚabÏ߶ÎÉÏ£¨Ç°ÌáÊÇcÔÚÖ±ÏßabÉÏ£©
{if (c.x >= min(a.x, b.x) && c.x <= max(a.x, b.x) && c.y >= min(a.y, b.y) && c.y <= max(a.y, b.y))return 1;return 0;
}
double area(Point b, Point c, double r)
{Point a(0.0, 0.0);if (dis(b, c) < eps)return 0.0;double h = fabs(cross(a, b, c)) / dis(b, c);if (dis(a, b) > r - eps && dis(a, c) > r - eps) //Á½¸ö¶Ëµã¶¼ÔÚÔ²µÄÍâÃæÔò·ÖΪÁ½ÖÖÇé¿ö{double angle = acos(dot(a, b, c) / dis(a, b) / dis(a, c));if (h > r - eps)return 0.5 * r * r * angle;else if (dot(b, a, c) > 0 && dot(c, a, b) > 0){double angle1 = 2 * acos(h / r);return 0.5 * r * r * fabs(angle - angle1) + 0.5 * r * r * sin(angle1);}elsereturn 0.5 * r * r * angle;}else if (dis(a, b) < r + eps && dis(a, c) < r + eps)return 0.5 * fabs(cross(a, b, c)); //Á½¸ö¶Ëµã¶¼ÔÚÔ²ÄÚµÄÇé¿öelse //Ò»¸ö¶ËµãÔÚÔ²ÉÏÒ»¸ö¶ËµãÔÚÔ²ÄÚµÄÇé¿ö{if (dis(a, b) > dis(a, c))swap(b, c); //ĬÈÏbÔÚÔ²ÄÚif (fabs(dis(a, b)) < eps)return 0.0; //ab¾àÀëΪ0Ö±½Ó·µ»Ø0if (dot(b, a, c) < eps){double angle1 = acos(h / dis(a, b));double angle2 = acos(h / r) - angle1;double angle3 = acos(h / dis(a, c)) - acos(h / r);return 0.5 * dis(a, b) * r * sin(angle2) + 0.5 * r * r * angle3;}else{double angle1 = acos(h / dis(a, b));double angle2 = acos(h / r);double angle3 = acos(h / dis(a, c)) - angle2;return 0.5 * r * dis(a, b) * sin(angle1 + angle2) + 0.5 * r * r * angle3;}}
}
int main()
{int n = 4;double rx, ry, R;scanf("%lf%lf%lf", &rx, &ry, &R);scanf("%lf%lf%lf%lf", &p[1].x, &p[1].y, &p[3].x, &p[3].y);p[2].x = p[1].x;p[2].y = p[3].y;p[4].x = p[3].x;p[4].y = p[1].y;p[5] = p[1];Point O(rx, ry);for (int i = 1; i <= n + 1; i++)p[i] = p[i] - O;O = Point(0, 0);double sum = 0;for (int i = 1; i <= n; i++){int j = i + 1;double s = area(p[i], p[j], R);if (cross(O, p[i], p[j]) > 0)sum += s;elsesum -= s;}printf("%.4lf\n", fabs(sum));
}
CTU Open Contest 2019 C. Beer Coasters(计算几何)相关推荐
- CTU Open Contest 2019
A. Beer Barrels 题意:给出四个整数:A,B,K,C,A,B,C 都是大于 0 的个位数,问在所有仅由 A 或 B 组成的 K 位数中(K 位数的每一位都是 A 或 B),数字 C 的个 ...
- CTU Open Contest 2019 计蒜客重现补题报告
个人总结 寒假过完的第一场比赛,总是有很多问题.主要有以下两点:一是寒假做题有点依赖翻译,看不下去很长的英文题面,导致这次比赛的一些题目看很长时间也没看懂.二是发现了自己的做题量仍然很少,很多题目缺乏 ...
- Beer Coasters
Beer Coasters 计算几何,求圆和凸多边形的相交面积模板. Beer Coasters Often, in an average pub, the beer is served in a m ...
- 2021年度训练联盟热身训练赛第二场(ICPC North Central NA Contest 2019,南阳师范学院),签到题ABCDEFGIJ
A. Binarize It,简单枚举 链接:https://ac.nowcoder.com/acm/contest/12794/A 来源:牛客网 题目描述 Professor Boolando ca ...
- HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019
今日这场比赛我们准备的题比较全面,二分+数论+最短路+计算几何+dp+思维+签到题等.有较难的防AK题,也有简单的签到题.为大家准备了一份题解和AC代码. A - Meeting with Alien ...
- Central Europe Regional Contest 2019 J. Saba1000kg (并查集+根号讨论)
链接:https://ac.nowcoder.com/acm/contest/7817/I 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...
- 2018 Benelux Algorithm Programming Contest (BAPC 18) J-Janitor Troubles(计算几何公式)
思路来源 https://www.cnblogs.com/elpsycongroo/p/6777584.html 题意 给四条边边长,保证一定可以构成一个四边形. 问其构成最大的四边形的面积. 题解 ...
- Helvetic Coding Contest 2019 online mirror (teams allowed, unrated)
http://codeforces.com/contest/1184 A1 找一对整数,使x^x+2xy+x+1=r 变换成一个分式,保证整除 #include<iostream> #in ...
- Yahoo Programming Contest 2019 F - Pass
传送门 题目大意 给定一个只包含012序列,0表示这个人有2个红球,1表示一个红球一个蓝球,2表示两个蓝球.进行n*2次游戏,每次游戏所有有球的人选择一个球递给前一个人,第一个人把球放到一个序列中,' ...
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem C. Equivalent Cards 计算几何
Problem C. Equivalent Cards 题目连接: http://www.codeforces.com/gym/100253 Description Jane is playing a ...
最新文章
- C语言实例第1期:十进制数转换二进制数
- android后台截屏实现(3)--编译screencap
- 可再生能源建设提速 风电光伏业高景气可期
- 5-32 说反话-加强版
- sublime多行变一行及sublime一键格式化html/css/js、光标快捷键移动行首行尾、删除空行
- socket-Java
- 关于线上问题处理心得分享
- python 城市地图_使用底图获取城市地图的最佳方法? - python
- 有爱无碍,科技为他们点亮漫天星光
- 数据库课程设计基础需求
- matlab三角函数用法
- C/C++程序设计题
- 抖音无水印视频批量下载助手
- 拼多多订单详情接口订单同步接口
- 【论文】360-aware saliency estimation with conventional image saliency predictors阅读笔记
- 生动的ajax图片显示效果,LightBox
- 华为智慧屏 鸿蒙如何,抛开鸿蒙 华为智慧屏V65作为电视合格吗?
- wxwork和wx.qy判断企业微信小程序编译运行环境
- Union can only be performed on tables with the compatible column types
- java对数字证书的验证_JAVA对数字证书的常用操作