本文涉及知识点
预习
凸多边形切线 :对于凸多边形 PP,一条直线 LL 称为 PP 的切线(支撑线),当且仅当:
LL 与 PP 有公共点(相交或相切)
PP 完全位于 LL 的某一侧(包括边界上)
换句话说,切线是"贴着"凸多边形但不穿过它内部的直线。
经过凸多边形P顶点的切线无数条,经过P非顶点的切线只有一条。
比较难证明的点不证明
凹函数在凸集上的最小值(若存在)必在极点(端点)取得;等价地,凸函数在凸集上的最大值(若存在)必在极点取得。《凸优化》或《凸分析》。
严格凸多边形角度严格递增
设严格凸多边形P的顶点排列为 p 0 , p 1 , ⋯ , p n − 1 , 边 e i = p i p i + 1 的方向角度为 θ i ∈ [ 0 , 360 ∘ ) 。 p_0,p_1,\cdots ,p_{n-1},边e_i=p_ip_{i+1}的方向角度为\theta_i \in [0,360^\circ)。 p0,p1,⋯,pn−1,边ei=pipi+1的方向角度为θi∈[0,360∘)。 设 θ 0 是所有边方向角最小的。则从 e 0 开始,各边的方向角在 [ 0 , 360 ∘ ) 设\theta_0是所有边方向角最小的。则从e_0开始,各边的方向角在[0,360^\circ) 设θ0是所有边方向角最小的。则从e0开始,各边的方向角在[0,360∘)单调增加。 θ 0 < θ 1 < ⋯ θ n − 1 < θ 0 + 360 \theta_0 <\theta_1<\cdots \theta_{n-1}<\theta_0+360 θ0<θ1<⋯θn−1<θ0+360。
由于是逆时针旋转: θ i + 1 − θ i ∈ ( 0 , 180 ∘ ) \theta_{i+1}-\theta_i \in (0,180^\circ) θi+1−θi∈(0,180∘)
令 d 0 = e 0 的方向角, d i = d i − 1 + r , r 是 e i − 1 旋转到 e i 的角度 , r ∈ ( 0 , 180 ) 令d_0=e_0的方向角,d_i=d_{i-1}+r,r是e_{i-1}旋转到e_i的角度,r \in(0,180) 令d0=e0的方向角,di=di−1+r,r是ei−1旋转到ei的角度,r∈(0,180),由于旋转一周,故 d n = 360 + d 0 d_n=360+d_0 dn=360+d0,d后面的元素是前一个元素增加一个,故d严格递增,由于 e 0 e_0 e0最小,故 d 1 ∼ n − 1 不可能 + 360 ,否则会大于 d n d_{1\sim n-1}不可能+360,否则会大于d_n d1∼n−1不可能+360,否则会大于dn,和递增矛盾。
下面来证明 d n d_n dn旋转一周,而不是两周。
e i − 1 到 e i 旋转的角度是 180 − 两条边对应的内角, n 条边旋转一轮 = 180 n − 内角和 = 180 n − 180 ( n − 2 ) = 360 e_{i-1}到e_i旋转的角度是 180-两条边对应的内角,n条边旋转一轮=180n-内角和=180n -180(n-2)=360 ei−1到ei旋转的角度是180−两条边对应的内角,n条边旋转一轮=180n−内角和=180n−180(n−2)=360
推论:边的外发矢也严格递增。
对踵点对(Antipodal Pair)
说法一:若存在一对平行支撑线,分别经过 P 的两个顶点 p i 和 p j p_i和p_j pi和pj,使得整个多边形夹在这两条平行线之间,则称 ( p i , p j ) (p_i,p_j) (pi,pj)为对踵点对。
说法二:如果存在一个方向 ≠ ⃗ 0 \vec \neq 0 = 0,使得 < p , v ⃗ > ≤ < x , v ⃗ > ≤ < q , v ⃗ > ∀ x ∈ P <p,\vec v> \le <x,\vec v> \le <q ,\vec v>\forall x \in P <p,v >≤<x,v >≤<q,v >∀x∈P
我的理解:p是 v ⃗ \vec v v 的支撑点,q是 − v ⃗ -\vec v −v 的支撑点,根据支撑函数的知识,只有 v ⃗ 或 − v ⃗ \vec v或-\vec v v 或−v 是任意边的外法矢,pq才会发生变化。一句废话 : v ⃗ , − v ⃗ \vec v,-\vec v v ,−v 同时垂直于某矢量或同时不垂直于某矢量。
故只需要枚举外法矢,时间复杂度O(n)。
凸多边形直径端点(最远点对)
直径端点:设P是凸多边形,若p,q ∈ P \in P ∈P满足: ∣ ∣ p − q ∣ ∣ = max x , y ∈ P ∣ ∣ x − y ∣ ∣ = D ||p-q||=\max\limits_{x,y\in P}||x-y||=D ∣∣p−q∣∣=x,y∈Pmax∣∣x−y∣∣=D,则称p,q为P的直径端点。
令 v ⃗ = q − p \vec v=q-p v =q−p
则 ∣ ∣ v ⃗ ∣ ∣ = D , ⟨ q , v ⃗ ⟩ − ⟨ p , v ⃗ ⟩ = ⟨ q − p , v ⃗ ⟩ = D 2 > 0 ||\vec v||=D,\langle q,\vec v\rangle - \langle p,\vec v \rangle=\langle q-p,\vec v\rangle =D^2 > 0 ∣∣v ∣∣=D,⟨q,v ⟩−⟨p,v ⟩=⟨q−p,v ⟩=D2>0
我们证明:对于任意 x ∈ P x \in P x∈P,都有 ⟨ p , v ⃗ ⟩ ≤ ⟨ x , v ⃗ ⟩ ≤ ⟨ q , v ⃗ ⟩ \langle p,\vec v \rangle \le \langle x,\vec v \rangle \le \langle q,\vec v \rangle ⟨p,v ⟩≤⟨x,v ⟩≤⟨q,v ⟩
证明左边不等式
假定 ∃ x ∈ P \exist x \in P ∃x∈P,使得 ⟨ x , v ⃗ ⟩ < ⟨ p , v ⃗ ⟩ \langle x,\vec v \rangle < \langle p,\vec v \rangle ⟨x,v ⟩<⟨p,v ⟩即 ⟨ p − x , v ⃗ ⟩ > 0 \langle p-x,\vec v\rangle >0 ⟨p−x,v ⟩>0
计算q到x的距离平方: ∣ ∣ q − x ∣ ∣ 2 = ∣ ∣ ( q − p ) + ( p − x ) ∣ ∣ 2 = ∣ ∣ v ⃗ ∣ ∣ 2 + 2 ⟨ v ⃗ , p − x ⟩ + ∣ ∣ p − x ∣ ∣ 2 = D 2 + 2 ⟨ v ⃗ , p − x ⟩ + ∣ ∣ p − x ∣ ∣ 2 ||q-x||^2=||(q-p)+(p-x)||^2 \\=||\vec v||^2+2\langle \vec v,p-x \rangle +||p-x||^2\\ =D^2 + 2\langle \vec v,p-x \rangle + ||p-x||^2 ∣∣q−x∣∣2=∣∣(q−p)+(p−x)∣∣2=∣∣v ∣∣2+2⟨v ,p−x⟩+∣∣p−x∣∣2=D2+2⟨v ,p−x⟩+∣∣p−x∣∣2
由于 ⟨ v ⃗ , p − x ⟩ > 0 → ∣ ∣ q − x ∣ ∣ 2 > D 2 \langle \vec v,p-x \rangle >0 \to ||q-x||^2 > D^2 ⟨v ,p−x⟩>0→∣∣q−x∣∣2>D2 与D是最大值矛盾。
证明右边不等式
假设 ∃ x ∈ P , ⟨ x , v ⃗ ⟩ > ⟨ q , v ⃗ ⟩ → ⟨ q − x , v ⃗ ⟩ < 0 \exist x \in P, \langle x,\vec v \rangle >\langle q,\vec v \rangle \to \langle q-x,\vec v \rangle<0 ∃x∈P,⟨x,v ⟩>⟨q,v ⟩→⟨q−x,v ⟩<0。
∣ ∣ p − x ∣ ∣ 2 = ∣ ∣ ( p − q ) + ( q − x ) ∣ ∣ 2 = D 2 − 2 ⟨ < v ⃗ , q − x > + ∣ ∣ q − x ∣ ∣ 2 ||p-x||^2=||(p-q)+(q-x)||^2=D^2-2\langle <\vec v,q-x>+||q-x||^2 ∣∣p−x∣∣2=∣∣(p−q)+(q−x)∣∣2=D2−2⟨<v ,q−x>+∣∣q−x∣∣2
由于 − 2 ⟨ < v ⃗ , q − x > > 0 , ∣ ∣ q − x ∣ ∣ 2 ≥ 0 -2\langle <\vec v,q-x>>0,||q-x||^2 \ge 0 −2⟨<v ,q−x>>0,∣∣q−x∣∣2≥0
故 ∣ ∣ p − x ∣ ∣ 2 > D 2 ||p-x||^2 > D^2 ∣∣p−x∣∣2>D2 与假设矛盾。
最小外接矩形(Minimum Area Encloseing Rectangle)
定义 :给定凸多边形P,求一个面积最小的矩形R,使得 P ⊆ R P \subseteq R P⊆R。
核心定理 :最小面积的外接矩形必定有一条边与凸多边P形某条边共线。
当矩形方向角 θ \theta θ确定时,矩形就确定了,长和宽是凸多边形在 θ 和 θ + 90 ∘ \theta 和\theta+90^\circ θ和θ+90∘的投影。
最小外接矩形矩形的两组边都是对踵点对,如果一组平行边对应的对踵点有一个是线段,则符合定理。故我们假定P的四个顶点ABCD在矩形上。AC是一组对踵点,BD是一组对踵点。故无论是逆时针旋转,还是顺时针旋转,AC和BD在和外法矢平行之前,对踵点不会变化。此是A( θ \theta θ)的变化规律如何?
我们旋转P代替旋转矩形。
α \alpha α是AC或CA的方向角,哪个余弦为正取哪个。
β \beta β是BD或DB的方向角,哪个正弦为正,取哪个。
矩形的宽度:f( θ \theta θ)=||AC|| cos ( α + θ ) \cos (\alpha+\theta) cos(α+θ) 矩形的高度:g( θ \theta θ)=||BD|| sin ( β + θ ) \sin(\beta+\theta) sin(β+θ)
f,g为0,则面积为0,故非法。原因:在面积为0前,支撑点发生了变化。由于f,g是连续函数,故无法越过0,直接从正数变成负数。故fg恒为正。 A ( θ ) = f ( θ ) g ( θ ) A(\theta)=f(\theta)g(\theta) A(θ)=f(θ)g(θ)
积化和差
积化和差公式: cos X sin Y = 1 2 sin ( X + Y ) − sin ( X − Y ) 令 X = α + θ , Y = β + θ A ( θ ) = ∣ ∣ A C ∣ ∣ ∣ ∣ B D ∣ ∣ 2 sin ( α + β + 2 θ ) − sin ( α − β ) 积化和差公式:\cos X\sin Y=\frac 1 2\\sin(X+Y)-\\sin(X-Y)\\ 令X=\alpha+\theta,Y=\beta+\theta\\ A(\theta)=\frac {||AC||||BD||}2\\sin(\\alpha+\\beta+2\\theta)-\\sin(\\alpha-\\beta) 积化和差公式:cosXsinY=21sin(X+Y)−sin(X−Y)令X=α+θ,Y=β+θA(θ)=2∣∣AC∣∣∣∣BD∣∣sin(α+β+2θ)−sin(α−β)只关心最小值,故可忽略正常数。
凹性
A'( θ \theta θ)= 2 cos ( α + β + 2 θ ) , A ′ ′ ( θ ) = − 4 sin ( α + β + 2 θ ) 2\cos(\alpha+\beta+2\theta),A''(\theta)=-4\sin(\alpha+\beta+2\theta) 2cos(α+β+2θ),A′′(θ)=−4sin(α+β+2θ)
在支撑点不变空间, cos ( α + θ ) > 0 → ( α + θ ) ∈ ( − 90 ∘ , 90 ∘ ) sin ( β + θ ) > 0 → β + θ ∈ ( 0 , 180 ∘ ) α + β + 2 θ ∈ ( − 90 ∘ , 270 ∘ ) 结论一 \cos(\alpha+\theta)>0 \to (\alpha+\theta) \in (-90^\circ,90^\circ)\\ \sin(\beta+\theta)>0 \to \beta+\theta \in (0,180^\circ)\\ \alpha+\beta+2\theta \in (-90^\circ,270^\circ)结论一 cos(α+θ)>0→(α+θ)∈(−90∘,90∘)sin(β+θ)>0→β+θ∈(0,180∘)α+β+2θ∈(−90∘,270∘)结论一
如果 A ′ ( θ ) ≠ 0 A'(\theta)\neq 0 A′(θ)=0,则 A ′ ( θ ) A'(\theta) A′(θ)一定不是局部极值点。故只需要考虑 A ′ ( θ ) = 0 A'(\theta)=0 A′(θ)=0,即 α + β + 2 θ 为 90 ∘ 或 270 ∘ ,根据结论一,只能是 90 ∘ 。为 90 ∘ 时 A ′ ′ ( 90 ∘ ) < 0 ,故只有局部最大值,没有局部最小值。 \alpha+\beta+2\theta为90^\circ或270^\circ,根据结论一,只能是90^\circ。为90^\circ时A''(90^\circ)<0,故只有局部最大值,没有局部最小值。 α+β+2θ为90∘或270∘,根据结论一,只能是90∘。为90∘时A′′(90∘)<0,故只有局部最大值,没有局部最小值。
闭区间连续函数,没有局部最小值。则最小值一定在端点处。

应用广泛
计算距离
凸多边形直径
凸多边形宽
凸多边形间最大距离
凸多边形间最小距离
外接矩形
最小面积外接矩形
最小周长外接矩形
三角剖分
洋葱三角剖分
螺旋三角剖分
四边形剖分
凸多边形属性
合并凸包
找共切线
凸多边形交
临界切线
凸多边形矢量和
最薄截面
最薄横截带:等价说法:凸多边形的最小宽度(Minimum Width)。

扩展阅读
| 计算几何为骨,排样优化为魂 |
|---|
| 作品:亲士CAD工具箱 |
| 经典文章推荐:二维排样 |
| 万物皆数学 |
| 查阅鄙人的博文,请点击博文下载学院导航 |
| 活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。 |
| 子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。
