【模板】计算几何入门
来源
计算几何基本模板(二维)
目录
- 基本设置
- 点 + 向量
- Point(Vector)
- 点积(数量积、内积)
- 向量积,叉积
- 两点间距离
- 向量的模
- 单位向量
- 两向量的夹角
- 判断点在直线的哪边
- 逆转角
- 线
- 直线表达式
- Line
- 判断三点共线
- 点到直线的距离
- 点到线段的距离
- 判断点是否在线段上
- 判断直线与线段是否相交
- 判断两线段是否相交
- 判断两直线平行
- 求两直线交点
- 多边形
- 三角形面积
- 三角形四心
- 正弦定理 & 余弦定理
- 正多边形性质
- 求多边形面积
- 判断点在多边形内
- 判断凸多边形
- 圆
- Circle
- 扇形面积
- 点与圆位置关系
- 直线与圆位置关系
- 直线与圆交点
- 圆与圆位置关系
- 圆与圆交点
- 求圆的切点
- 三角形外接圆
- 三角形内切圆
- 网格
- 线段整点个数
- 多边形边整点个数
- 多边形内整点个数
- 极角排序
- 凸包算法
- 最小圆覆盖
- 圆的面积并
- 圆与多边形面积交
- 自适应辛普森积分
- 平面最近点对
基本设置
- 使用
long double
提高精度 - 定义常数
eps=1e-8
和PI=acos(-1.0)
- 实现
sgn()
函数处理浮点数精度判断
点 + 向量
Point(Vector)
struct Point { /*...*/ };
- 包含坐标(x,y)和运算符重载
点积(Dot)
A ⃗ ⋅ B ⃗ = ∣ A ∣ ∣ B ∣ cos θ \vec{A} \cdot \vec{B} = |A||B|\cos\theta A⋅B=∣A∣∣B∣cosθ
double operator*(Vector &A, Vector &B);
叉积(Cross)
A ⃗ × B ⃗ = ∣ A ∣ ∣ B ∣ sin θ \vec{A} \times \vec{B} = |A||B|\sin\theta A×B=∣A∣∣B∣sinθ
double operator^(Vector &A, Vector &B);
两点间距离
d i s t ( A , B ) = ( A . x − B . x ) 2 + ( A . y − B . y ) 2 dist(A,B) = \sqrt{(A.x-B.x)^2 + (A.y-B.y)^2} dist(A,B)=(A.x−B.x)2+(A.y−B.y)2
向量模长
∣ A ∣ = A . x 2 + A . y 2 |A| = \sqrt{A.x^2 + A.y^2} ∣A∣=A.x2+A.y2
单位向量
n o r m ( A ) = A ∣ A ∣ norm(A) = \frac{A}{|A|} norm(A)=∣A∣A
向量夹角
θ = arccos ( A ⋅ B ∣ A ∣ ∣ B ∣ ) \theta = \arccos(\frac{A \cdot B}{|A||B|}) θ=arccos(∣A∣∣B∣A⋅B)
点关于直线的位置判断
- 使用叉积判断点在线段的左右关系
向量旋转
A ⃗ ′ = ( x cos θ − y sin θ , x sin θ + y cos θ ) \vec{A}' = (x\cos\theta - y\sin\theta, x\sin\theta + y\cos\theta) A′=(xcosθ−ysinθ,xsinθ+ycosθ)
线
直线表达式
- 一般式: A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0
- 点向式: P ⃗ = P 0 + t d ⃗ \vec{P} = P_0 + t\vec{d} P=P0+td
Line结构体
struct Line { Point s, e; };
三点共线判断
( B − A ) × ( C − B ) = 0 (B-A) \times (C-B) = 0 (B−A)×(C−B)=0
点到直线距离
d = ∣ A B ⃗ × A P ⃗ ∣ ∣ A B ∣ d = \frac{|\vec{AB} \times \vec{AP}|}{|AB|} d=∣AB∣∣AB×AP∣
点到线段距离
- 分三种情况:垂直投影在线段内/外
点在线段上判断
- 通过点积和叉积综合判断
直线与线段相交判断
- 利用叉积符号判断端点位置
线段相交判断
- 快速排斥试验
- 跨立试验
直线交点求解
t = ( C D ⃗ × C A ⃗ ) ( C D ⃗ × A B ⃗ ) t = \frac{(\vec{CD} \times \vec{CA})}{(\vec{CD} \times \vec{AB})} t=(CD×AB)(CD×CA)
多边形
三角形面积
- 海伦公式
- 叉积公式: 1 2 ∣ A B ⃗ × A C ⃗ ∣ \frac{1}{2}|\vec{AB} \times \vec{AC}| 21∣AB×AC∣
多边形面积
- 鞋带定理: 1 2 ∣ ∑ i = 0 n − 1 ( P i × P i + 1 ) ∣ \frac{1}{2}|\sum_{i=0}^{n-1}(P_i \times P_{i+1})| 21∣∑i=0n−1(Pi×Pi+1)∣
点在多边形内判断
- 射线法统计交点奇偶性
- 凸多边形方向法
凸包求解(Andrew算法)
- 按坐标排序
- 维护上下凸壳
圆
圆与点位置关系
- 计算点到圆心距离与半径比较
直线与圆相交
- 代数法解方程组求交点
圆与圆相交
- 计算圆心距与半径关系
最小圆覆盖
- 随机增量法逐步扩展
网格相关
线段整点计数
- 利用GCD计算格点数
皮克定理
S = I + B 2 − 1 S = I + \frac{B}{2} - 1 S=I+2B−1
高级算法
极角排序
- 分象限处理,避免浮点误差
自适应辛普森积分
- 自动划分区间积分
平面最近点对
- 分治法结合归并排序