【计算几何】对踵点对 旋转卡壳 直径

本文涉及知识点

数学 几何

预习

凸多边形切线 :对于凸多边形 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++**实现。

相关推荐
HIT_Weston4 小时前
14、【数学】【线性代数】one-hot 与基向量:分类目标为什么能当概率分布
线性代数·数学
Luhui Dev6 天前
大角几何 3D 渲染 API 上线:让立体题图进入自动化生产流程
人工智能·数学·luhuidev
闻缺陷则喜何志丹6 天前
【计算几何】Clipper的偏移
数学·偏移·计算几何·裁剪·clipper
HIT_Weston8 天前
7、【数学】【基础】复数是什么:从解方程到旋转
数学·基础
铸人8 天前
再论勾股定理成立的条件-28
数学·几何学·复数·物理
HIT_Weston9 天前
5、【数学】【基础】归一化的几何意义:球面、超平面与信息去哪了
数学·基础
email4u11 天前
当 AI 开始解决数学难题
人工智能·数学
Tisfy13 天前
LeetCode 0836.矩形重叠:xy两方向分别看
数学·leetcode·题解·模拟
闻缺陷则喜何志丹13 天前
【计算几何】布尔运算交并补异或
数学·计算几何·布尔运算·奇偶填充·非零填充·正数填充·负数填充