Appearance
圆基础
- 圆的表示:圆心、半径
。除非特别说明,下文的圆与圆关系、交点和公切线公式均假设半径严格为正; 时图形退化为一个点,需要单独处理 - 圆的周长:
- 圆的面积:
圆的关系问题
点与圆的关系
- 点在圆外
- 点在圆上
- 点在圆内
判定方法:将点到圆心距离的平方与半径平方比较,可以避免开平方。
平方比较只避免了开平方,并不会自动消除误差。输入及中间运算采用精确数值表示且不溢出时,比较结果才是精确的;算法竞赛中最常见的情形是整数输入,并使用足够宽的中间类型。例如输入为 long long 时,中间乘积常需使用 __int128。若输入为浮点数,平方比较仍有舍入误差,需要使用与数据尺度匹配的容限。
直线与圆的关系
- 相离
- 相切
- 相交
设直线为
来区分相离、相切和相交,从而避免除法与开平方。该比较在数值及中间运算均精确且不溢出时可以得到精确结果;浮点输入仍需容限。
圆与圆的关系
令两个正半径圆的半径分别为
- 相同:
且 ; - 同心但不同圆:
且 ,较小圆严格内含于较大圆; - 相离:
; - 外切:
; - 相交于两点:
; - 内切:
; - 严格内含:
。
若讨论圆盘的覆盖关系,则较小圆盘被较大圆盘完全覆盖当且仅当
浮点实现中的相等关系均应使用容限。若允许零半径,应先把退化圆当作点处理,否则同圆、内切和外切条件可能同时成立,以上分类及后续切线数量表不再适用。
交集问题
直线与圆的交点
前提:直线方向向量
直线:
圆:
设圆心到直线的距离为
相切时根号部分为 max 用于吸收浮点误差造成的微小负数;它不能代替前面的相交关系判断。
圆与圆交点
以下公式要求
重合圆有无穷多个交点;相离、严格内含或同心但半径不同的圆没有交点,这些情况均应在使用公式前返回。
两圆圆心连线与一圆心到交点连线夹角
根据余弦定理,先计算
浮点实现中将
严格相交时可得到两个交点;内切或外切时
将两圆心连线对应向量进行伸缩旋转。
圆与多边形面积交
按多边形的每条有向边
多个圆的面积并
这里求的是多个圆盘覆盖区域的面积。预处理时应先丢弃零半径圆,将完全相同的圆去重;若圆
则圆盘
对保留下来的每个圆,求出其边界被其它圆覆盖的极角区间。只有严格部分相交的两圆才需要生成覆盖角区间;若通过 acos 计算半角,应先将浮点余弦值限制到
设当前圆心为
将所有可见圆弧的贡献相加再除以
切线问题
过圆外一点圆的切线
设点到圆心的距离为
浮点实现中先将
- 向量伸缩、旋转
点在圆上时只有一条切线,点在圆内时没有实切线,应在套用上述构造前分别处理。
两圆的公切线
以下数量按不同的几何直线计数,并要求两个圆的半径均为正:
- 相同:无穷多条;
- 相离:
条; - 外切:
条; - 相交:
条; - 内切:
条; - 内含或同心但不同圆:
条。
外切时两条重合的内公切线只计作一条,内切时两条重合的外公切线也只计作一条。零半径圆退化为点,不适用这张切线数量表。
外公切线
对两个不同且非同心的正半径圆,外公切线构造使用
仅当
内公切线
内公切线构造使用
仅当
圆的反演
给定反演中心点
- 点
在射线 上
则称点
性质:
- 圆外的点的反演点在圆内,反之亦然
- 圆上的点的反演点为其自身
- 不过点
的圆,其反演图形也是不过点 的圆 - 过点
的圆,其反演图形是不过点 的直线 - 两个图形相切,则它们的反演图形也相切
最小圆覆盖
问题描述:给定平面上
边界情况:
- 一个点的最小覆盖圆以该点为圆心,半径为
;所有点重合时同理; - 两个不同点的最小覆盖圆以它们的中点为圆心,以两点距离的一半为半径;
- 三个不共线的点可以唯一确定外接圆;
- 三个点共线时不能直接套用外心公式,覆盖它们的最小圆由最远点对作为直径确定。
定理:如果点
将输入点按与原顺序独立的均匀随机排列打乱后,使用随机增量算法可以得到期望
