计算几何 I. 极角
参考资料
- hankcs.com: POJ 1981 Circle and Points 题解
- aswmtjdsj: POJ 1981 Circle and Points 【定长圆覆盖最多点问题】
- zxy_snow: 极角排序
概念
In mathematics, the polar coordinate system is a two-dimensional coordinate system in which each point on a plane is determined by a distance from a reference point and an angle from a reference direction.
The reference point (analogous to the origin of a Cartesian system) is called the pole, and the ray from the pole in the reference direction is the polar axis. The distance from the pole is called the radial coordinate or radius, and the angle is called the angular coordinate, polar angle, or azimuth.
SOURCE
计算极角
在C++里,可用定义于<cmath>中的std::atan2函数计算极角。
std::atan2(y, x) computes the arc tangent of y/x using the signs of arguments to determine the correct quadrant.
If no errors occur, the arc tangent of y/x in the range [-π, +π] radians, is returned.
SOURCE
有的资料(例如参考资料1)说 atan2 的返回值范围是 $(-\pi, \pi]$,这是不准确的。另外,对于极角排序而言,某个极角是写成 $-\pi$ 还是写成 $\pi$ 并没有区别,因为这两个值恰是区间的两端。
用两个极角表示的一段圆弧
在一些计算几何问题中,我们需要求同一个圆上的若干段弧的交集或并集。这个问题类似于在直线上求区间的并或交。我们可以用弧的两端点对圆心的极角来表示一段圆弧。如果直接用 atan2 来求极角,会出现两个问题:
- 实际问题中一般难以判断哪个点是起点,哪个点是终点(这里所谓“弧的起点、终点”对应于直线上区间的左、右端点)
atan2求出的极角并不能正确地表示「跨过极角为 $\pi$ 的射线(极轴的反向)」的弧
为了解决问题1,我们不直接求弧端点的极角,转而求「弧的中点」对圆心的极角,再求出弧的圆心角的大小(一般求圆心角的一半更为方便),这样便无需考虑起点终点的问题,自然就将弧表示成区间了且区间长度就是弧的圆心角大小。
为了解决问题2,若所求出的「弧的中点的圆心角」为负值,就将其加上 $2\pi$。
(注意:参考资料2中的解法,并没有处理问题2,是有bug的)
这两个技巧都比较巧妙,请读者仔细体会。
习题
极角排序
见参考资料3。
计算几何 I. 极角的更多相关文章
- hrbustoj 1305:多边形(计算几何,极角排序练习)
多边形 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 113(42 users) Total Accepted: 51(3 ...
- HDU 5784 How Many Triangles
计算几何,极角排序,双指针,二分. 直接找锐角三角形的个数不好找,可以通过反面来求解. 首先,$n$个点最多能组成三角形个数有$C_n^3$个,但是这之中还包括了直角三角形,钝角三角形,平角三角形,我 ...
- ●POJ 2007 Scrambled Polygon
题链: http://poj.org/problem?id=2007 题解: 计算几何,极角排序 按样例来说,应该就是要把凸包上的i点按 第三像限-第四像限-第一像限-第二像限 的顺序输出. 按 叉积 ...
- CodeForces - 197D
开场连wa三发A题,差点心态崩了,还好坚持打完了,一共A了三题 A题,判断能不能放第一个圆,能放的话,先手比赢 #include<map> #include<set> #inc ...
- poj 1696:Space Ant(计算几何,凸包变种,极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2876 Accepted: 1839 Descrip ...
- 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles
平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...
- 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...
- bzoj 5099 [POI2018]Pionek 计算几何 极角排序
[POI2018]Pionek Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 80[Submit][Status][Disc ...
- 【计算几何】【极角序】【前缀和】bzoj1132 [POI2008]Tro
把点按纵坐标排序,依次枚举,把它作为原点,然后把之后的点极角排序,把叉积的公式稍微化简一下,处理个后缀和统计答案. #include<cstdio> #include<cmath&g ...
随机推荐
- uvm_factory——我们的工厂(二)
上节我们说到uvm_object_registry #(T),uvm_object_reistry 又继承自uvm_object_wrapper,所以首先,让我们先看看它爹是啥样子的: //----- ...
- github入门之创建仓库--3
1.登陆到github,点击加号中的New repository 2.设置仓库信息 *注: ------Description:添加仓库说明,不是必填项 ------Public.Private:选择 ...
- SqlServer表和excel数据批量复制方法
SqlServer表和excel数据批量复制方法 一.SqlServer表数据复制到excel方法: 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键“复制”(如果需要表字段名称,则 ...
- 洛谷 2543 [AHOI2004]奇怪的字符串
题目描述 输入输出格式 输入格式: 输入文件中包含两个字符串X和Y.当中两字符串非0即1.序列长度均小于9999. 输出格式: X和Y的最长公共子序列长度. 输入输出样例 输入样例#1: 010101 ...
- @AutoWired注解使用时可能会发生的错误
@Autowired注解:用于对Bean的属性变量.属性的set方法及构造函数进行标注,配合对应的注解处理器完成Bean的自动配置工作.@Autowired注解默认按照Bean类型进行装配. 1.在 ...
- leetcode 127 单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...
- sparkmlib-相关系数
一.基本原理 在stat包中实现了皮尔逊(Pearson)与 斯皮尔曼(Spearman)两类相关系数的计算 (1)Pearson: (x,y)协方差/[(x标准方差)*(y标准方差)] 详情可以 ...
- 搭建一个入门springboot工程
springboot工程搭建(入门案例) 第一步:创建maven工程 第二步:设置项目信息 第三步:默认项目名称,不用改动(第二步已填写) 第三步:在pom.xml中导入依赖 SpringBoot要 ...
- 爬虫_python3_urllib
urlib库为python3的HTTP内置请求库 urilib的四个模块: urllib.request:用于获取网页的响应内容 urllib.error:异常处理模块,用于处理异常的模块 urlli ...
- Mysql,SqlServer,Oracle主键自动增长的设置
在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: CREATE TABLE google(id INT AUTO_INCREMENT PRIMARY ...