本文涉及知识点
预备知识
泰勒斯定理(Thales' Theorem)

由于是等腰三角型,故 ∠ A B O = ∠ B A O , ∠ A C O = ∠ C A O \angle ABO=\angle BAO,\angle ACO=\angle CAO ∠ABO=∠BAO,∠ACO=∠CAO,三角形的内积和为180度,故 2 ∠ B A O + 2 ∠ C A O = 180 ∘ → B A C = 90 ∘ 2\angle BAO+2\angle CAO= 180^\circ \to BAC=90^\circ 2∠BAO+2∠CAO=180∘→BAC=90∘。
圆周角定理
ABC是圆上一点,O是圆心。则圆心角是圆周角的两倍。 ∠ A O B = 2 ∠ A C B \angle AOB=2\angle ACB ∠AOB=2∠ACB
一,O在AB的边上,即AB是直径,直径的圆周角是 90 ∘ ,圆心角是 180 ∘ 90^\circ,圆心角是180^\circ 90∘,圆心角是180∘。

二,O在AC上, 因为是等边三角形,故 ∠ O B C = ∠ O C B , 三角形内积和 180 , 故 180 = 2 ∠ A C B + ∠ B O C 因为是等边三角形,故\angle OBC=\angle OCB,三角形内积和180,故180=2\angle ACB+ \angle BOC 因为是等边三角形,故∠OBC=∠OCB,三角形内积和180,故180=2∠ACB+∠BOC。
因为共线 180 = ∠ B O C + ∠ B O A , 两式相减 ∠ B O A = 2 ∠ A C B 180=\angle BOC + \angle BOA,两式相减 \angle BOA=2\angle ACB 180=∠BOC+∠BOA,两式相减∠BOA=2∠ACB。O在BC上类似。

三,O在三角形内部。

根据情况一情况二, ∠ B O D = 2 ∠ B C D , ∠ D O A = 2 ∠ D C A → ∠ B O A = 2 ∠ B C A \angle BOD=2\angle BCD,\angle DOA=2\angle DCA \to \angle BOA=2\angle BCA ∠BOD=2∠BCD,∠DOA=2∠DCA→∠BOA=2∠BCA
四,O在三角形的外部。

延长CO至圆上一点D,连接OA,OB。
∠ B C A = ∠ B C D − ∠ A C D \angle BCA=\angle BCD - \angle ACD ∠BCA=∠BCD−∠ACD
根据情况一二可得, ∠ B C D = ∠ B O D ÷ 2 , ∠ A C D = ∠ A O D ÷ 2 \angle BCD = \angle BOD \div 2,\angle ACD = \angle AOD \div 2 ∠BCD=∠BOD÷2,∠ACD=∠AOD÷2
两者相减的 ∠ B C A = ( ∠ B O D − ∠ A O D ) ÷ 2 = ∠ B O A ÷ 2 \angle BCA = (\angle BOD - \angle AOD)\div 2=\angle BOA \div 2 ∠BCA=(∠BOD−∠AOD)÷2=∠BOA÷2
圆上4点是凸多边形
圆心角不会达到360 ∘ ^\circ ∘,故圆周角不会超过180 ∘ ^\circ ∘。
四点共圆和圆内/圆外位置关系
已知BC,ABC不共线,BCD不共线。
AD同侧
如果四点共圆 ∠ B A C = ∠ B D C = 圆心角 2 \angle BAC=\angle BDC=\frac {圆心角} 2 ∠BAC=∠BDC=2圆心角

如果D在圆外

根据三角型内角和等于180 ∘ , 180 ∘ − ∠ D B C = ∠ B E C + ∠ B C E = ∠ B D C + ∠ B C D ^\circ,180^\circ -\angle DBC=\angle BEC+\angle BCE=\angle BDC + \angle BCD ∘,180∘−∠DBC=∠BEC+∠BCE=∠BDC+∠BCD
∠ B C D > ∠ B C E → ∠ B C D < ∠ B C E = ∠ B C A \angle BCD > \angle BCE \to \angle BCD < \angle BCE=\angle BCA ∠BCD>∠BCE→∠BCD<∠BCE=∠BCA
同理,如果D是圆内一点,则 ∠ B C D > ∠ B C E \angle BCD > \angle BCE ∠BCD>∠BCE
AD异侧
异侧,两个圆心角之和为360度,故两个圆周角为 180 ∘ 180^\circ 180∘。
前言
Delaunay :音译德劳内
我么不可能知道地球上每一处的高度。一种朴素的做法是,对于任意 p ∈ A p \in A p∈A,都找到与之最近的一个采样点,然后将p的高度设置为这个样本的高度。这样分成的地形并不连续,外观很不自然,如9.3。

首先,对P做三角剖分--由此分成平面的一个子区域划分,其中每张有界的面都是三角形,而其中的顶点就是来自与P的各点。这里假设,所选采样点容许我们通过构造三角面片,来覆盖地形的整个定义域。然后,将每个采样点提升至其对应高度,原来三角剖分中的每各三角形,都将转发成三维空间中的一个三角形。如图9-4所示。如此可得一个所谓的多面式地形,它可看作是一个分段性的连续函数的图形。

凭直觉,我们可以感觉a更合理。b的问题在于点q处的高度根据距离相对更远的两个点得到的。如果q恰好落在两个狭长的三角形之间的公共边上,就会出现这种问题。也就是根源在于这两个三角形的外形过于狭长。就是三角剖分中含有过小的夹角。我们的目标最小夹角最大化。
1 平面点集的三角剖分
任取平面上的一个点集P:={ p 1 , ⋯ p n p_1,\cdots p_n p1,⋯pn}。为了能够对P的三角形剖分做一个形式化定义。我们首先要引入极大平面子区域划分这一概念,是一种特殊的子区域划分--如果试图在其中任意两个(没有直接相联的)顶点之间引入一条新的边,都将破坏其平面性。换言之,任何不属于S的i边,必然与S中已经存在的某条边相交。这样,我们就可以将P的一个三角剖分,定义为"以P为顶点集的一个极大平面子区域划分"。
按照这一定义,三角剖分的存在性是显而易见的。除了唯一的那张无界面外,其它都是三角形。无论在哪个三角剖分中,沿着P的凸包边界,连接任何两个相邻点的线段,都必然是T中的一条边。T中全部有界面的并,必然恰为P的凸包。

对于同一点集P,任何三角剖分中所包含的三角形数目都是相等的。
定理9.1 :设P为由平面上不全部共线的任意n个点组成的一个集合,落在P的凸包边界上点的个数记作k。则P的任何一个三角剖分必然由2n-2-k个三角形组成,而且共有3n-3-k条边。
证明 :任取P的一个三角剖分T,T中三角形的数目记作m。面数nf=m+1。有界面有三条边,无界面有k条边,共3m+k条边,任意边都是两个面共有,故边数(3m+k)/2 顶点数n。根据欧拉公式:
n+m+1=(3m+k)2 → \to → 2n+2m+2=3m+k → \to → m=2n+2-k t o to to 边数=(6n-6-3k+k)/2=3n-3-k
任取P的一个三角形剖分T,假设其中含有m个三角形。考虑T中各三角形的总共3m个角度,并将它们按照升序排序。设排序结果为( a 1 , a 2 , ⋯ , a 3 m a_1,a_2,\cdots,a_{3m} a1,a2,⋯,a3m)。我们将 A ( T ) : = ( a 1 , a 2 , ⋯ , a 3 m ) A(T):=(a_1,a_2,\cdots ,a_{3m}) A(T):=(a1,a2,⋯,a3m)称为T的角度向量。取同一个集合P的另一个三角剖分T',令A(T'):-(a_1',a_2'\cdots a_{3m})为之对应的角度向量。按照字典序,如果A(T)大于A(T'),我们就说"T的角度向量大于T'的角度向量"。具体地,也就是存在一个下标i, 1 ≤ i ≤ 3 m 1 \le i \le 3m 1≤i≤3m满足:
对于j<i,都有 a j = a j ′ ,但 a i > a i ′ a_j=a_j',但a_i > a_i' aj=aj′,但ai>ai′。对于对P的任一三角剖分T',都有A(T) ≥ A ( T ′ ) \ge A(T') ≥A(T′),就称三角剖分T为角度最优的。
泰勒斯定理(Thales' theorem)
任意给定三个点p、q和r,它们在q处定义两个角度,其中较小的哪个记作 ∠ p q r \angle pqr ∠pqr。

定理9.2 :设C为一个圆,直线l与C相较于点a和b;另外,在l的同一侧有四个点p、q、r和s。假设p和q恰好落在C上,r和s分别位于C的内部和外部。则必有: ∠ a r b > ∠ a p b = ∠ a q b > ∠ a s b \angle arb > \angle apb = \angle aqb > \angle asb ∠arb>∠apb=∠aqb>∠asb
现在,针对P的任一T,我们来考察其中的某一条边e= p i p j ‾ \overline{p_ip_j} pipj。如果边e不属于T中那张无界面的边界,它必然会同时与两个三角形 p i p j p k 和 p i p j p l p_ip_jp_k和p_ip_jp_l pipjpk和pipjpl相关联。如果这两个三角形合起来构成一个凸四边形,那么用 p k p l 替换 p i p j p_kp_l替换p_ip_j pkpl替换pipj。我们就可以得到另一个三角剖分T'。这一操称做边翻转(edge flip)。

对于T与T'的角度向量,共有六处不同--A(T)中的六个角度{ a 1 ⋯ a 6 a_1 \cdots a_6 a1⋯a6},在A(T')中被换成了{a_1'、\cdots a_6'}。二者的差别如 图9-8所示。如果 min 1 ≤ i ≤ 6 < min 1 ≤ 6 a i ′ \min_{1\le i \le 6} < \min_{1 \le 6}a_i' min1≤i≤6<min1≤6ai′。我们将 p i p j p_ip_j pipj称为非法边。
观察结论9.3 :设e为三角剖分T中的一条非法边。在T中对e进行边翻转操作之后,设新的三角剖分为T',则必有A(T')>A(T)。
引理9.4 :设三角形 p i p j p k 和 p i p j p l 之间的公共边 p i p j ‾ p_ip_jp_k和p_ip_jp_l之间的公共边\overline{p_ip_j} pipjpk和pipjpl之间的公共边pipj,令C为由点 p i 、 p j 和 p k p_i、p_j和p_k pi、pj和pk确定的圆。 p i p j ‾ 是一条非法边 , 当且仅当点 p i 落在 C 的内部。而且,只要点 p i 、 p j 、 p k 和 p l 构成一个凸的四边形,并且不共圆,则 p i p j ‾ 和 p k p l ‾ 两者当中有且仅有一条非法边 \overline{p_ip_j}是一条非法边,当且仅当点p_i落在C的内部。而且,只要点p_i、p_j、p_k和p_l构成一个凸的四边形,并且不共圆,则\overline{p_ip_j}和\overline{p_kp_l}两者当中有且仅有一条非法边 pipj是一条非法边,当且仅当点pi落在C的内部。而且,只要点pi、pj、pk和pl构成一个凸的四边形,并且不共圆,则pipj和pkpl两者当中有且仅有一条非法边。
如果碰巧四点共圆,则两条边都是非法边。如果两个三角形共有一条非法边,则它们合起来必然构成一个凸的四边形。因此,无论何时,一旦发现一条非法边,都可以立即对它设施边翻转操作。
不含任何非法边的三角剖分,称为合法三角形剖分。角度最优的三角剖分必然是合法的三角剖分。给定一个初始的三角剖分,可以很容易地构造出一个合法的三角剖分,反复进行边翻转操作,直到所有的边都已合法。这个算法一定会结束,因为每一次迭代,角度向量都会单调增加。
翻转一定是更优解
根据三角形剖分定义,三角形内不包括其它端点。

删除BC,增加AD。以B和C为顶点的角度变大。根据拖泰斯定理, ∠ B D A > ∠ B C A , ∠ C D A > ∠ C B A \angle BDA > \angle BCA,\angle CDA > \angle CBA ∠BDA>∠BCA,∠CDA>∠CBA
△ A E B , △ C E D \triangle AEB,\triangle CED △AEB,△CED有一个角是对角,故 ∠ B A E + ∠ A B E = ∠ E C D + ∠ E D C \angle BAE + \angle ABE=\angle ECD + \angle EDC ∠BAE+∠ABE=∠ECD+∠EDC
∠ A B E < ∠ E D C , ∠ B A E > ∠ E C D \angle ABE < \angle EDC,\angle BAE > \angle ECD ∠ABE<∠EDC,∠BAE>∠ECD。
同理 ∠ E A C > ∠ E B D \angle EAC > \angle EBD ∠EAC>∠EBD
四个点只会翻转一次
如果D在ABC,内故 ∠ B D C > ∠ B A C \angle BDC>\angle BAC ∠BDC>∠BAC
如果A在BCD,内故 ∠ B A C > ∠ B D C \angle BAC>\angle BDC ∠BAC>∠BDC
两者矛盾。
四点共圆两种分法是同等解

∠ D A B = ∠ D A C + ∠ D C B ,故 ∠ D A B \angle DAB=\angle DAC+ \angle DCB,故\angle DAB ∠DAB=∠DAC+∠DCB,故∠DAB一定不是最小角,同理 ∠ A B C , ∠ B C D , ∠ C D A \angle ABC,\angle BCD,\angle CDA ∠ABC,∠BCD,∠CDA也不是。
余下8个角,可以分成4组,每组都是用一条弧的圆周角,故相等。4组角,每组在两种方案各一 个,故两种方案的最小角一定相等。
2 德劳内三角剖分
Voronoi图的对偶图记作G。其中,对于每一个Voronoi单元,各有一个节点;若两个单元之间共用一条边,则在这两个单元之间连接一条弧。这意味着,对应于Vor§中的每一条边,G中都有一条弧与之对应。

证明 :令DG§任意三角形是ABC,则ABC与Vor( P)相交部分是 △ A B C \triangle ABC △ABC的中垂线,中垂线交点即外心(外接圆的圆心),令外接圆的圆心是O,则ABC内没有P的点,否则此点比ABC更近。可能有其它点,也在圆上,即Vor§图上,O的度数大于3。除ABC外, △ A B C 内的点 \triangle ABC内的点 △ABC内的点全部在外接圆内。故 △ A B C \triangle ABC △ABC内P中其它点。
定理9.5 :任何平面点集的德劳内图都是一个平面图。即直线嵌入的任意两条边都不会跨越。
如图9-12所示, p i p j ‾ \overline{p_ip_j} pipj是德劳内图DG§中的一条边,当且仅当存在这样一个闭圆盘 C i j C_{ij} Cij。它的边界经过 p i , p j p_i,p_j pi,pj,而且其中不包含来自P的任何其它基点。当然这样一个圆盘的中心必然落在V(p_i)和V(p_j)之间的公共边上。

由顶点 p i 、 p j 以及 C i j 的中心 p_i、p_j以及C_{ij}的中心 pi、pj以及Cij的中心确定的那个三角形,记作 t i j t_{ij} tij。可以看出: t i j 的连接于 p i 和圆心 C i j 之间的那条边 t_{ij}的连接于p_i和圆心C_{ij}之间的那条边 tij的连接于pi和圆心Cij之间的那条边,必然完全落在 V o r ( p i ) Vor(p_i) Vor(pi)内; p j 也有类似性质 p_j也有类似性质 pj也有类似性质。现在,任取DG§的另外一条边 p k p l ‾ \overline{p_kp_l} pkpl,参考 C i j 和 t i j C_{ij}和t_{ij} Cij和tij的定义方法,也可以定义出圆盘 C k l 以及三角形 t k l C_{kl}以及三角形t_{kl} Ckl以及三角形tkl。
假若 p i p j ‾ 与 p k p l ‾ \overline{p_ip_j}与\overline{p_kp_l} pipj与pkpl相交。 p k 和 p j 必然在三角形 t i j 之外。 p_k和p_j必然在三角形t_{ij}之外。 pk和pj必然在三角形tij之外。线段两个端点都在三角形外,无法与三角形相交。
任何集合,只要没有任何四点共圆,(在本章中)我们就称它是处于一般性位置的。若P处于一般性位置,则在其对应的Voronoi图中,每个顶点的度数必定是3。P的德劳内三角是唯一确定的,当且仅当P出处于"一般性位置"。
似乎可以这样:n点共线,DG(P )的图就是凸n边形。
共圆的任意凸多边形任意三角剖分都是最优解

不失一般性,令 ∠ D A C \angle DAC ∠DAC是最小交,任意剖分方案,DC所在的三角形是DCX,则 ∠ D A C = ∠ D X C \angle DAC =\angle DXC ∠DAC=∠DXC都是弧DC的圆周角。
四定理
定理9.6 :设P为任一平面点集,则在P的德劳内图中:
一,三个点 p i , p j , p k ∈ P p_i,p_j,p_k\in P pi,pj,pk∈P同为某张面的顶点,当且仅当 p i , p j , p k p_i,p_j,p_k pi,pj,pk外接圆内部不含P中任何点。
二,两个点 p i , p j ∈ P p_i,p_j\in P pi,pj∈P同时与某条边相关联,当且仅当存在一个闭圆盘C,除了 p i 和 p j p_i和p_j pi和pj落在其边界之外,该圆盘不包含P中其它任何点。
定理9.7 :设P为平面上的任一点集,而T为P的任一三角剖分。则T是P的德劳内三角剖分,当且仅当在T中每个三角形的外接圆的内部,都不包含P的任意点。
定理9.8 :设P为平面上的任一点集。则T是P的一个合法三角剖分,当且仅当T是P的的老内三角剖分。
定理9.9:设P为任一平面点集。P的任一角度最优的三角剖分,必是P的一个德劳内三角剖分。此外,在P的所有三角剖分中,德劳内三角剖分使最小角达到最大。
3 构造德劳内三角剖分
本节采用随机增量式算法来计算德劳内三角剖分。在第4章种解决线性规划问题时,以及在第6章中解决点定位问题时,这类算法都曾获得过成功。第六章中,首先用一个足够大的矩形,将整个场景都包括进去,避免无界梯形之类的麻烦。此处用一个足够大的三角形将整个点集P包围起来。为此,需要引入两个辅助点 p − 1 和 p − 2 p_{-1}和p_{-2} p−1和p−2,它们与P的最高点联合构成的三角形,将包含所有的点。我们计算P ∪ p − 1 , p − 2 \cup{p_{-1},p_{-2}} ∪p−1,p−2的德劳内三角剖分,然后删除 p − 1 , p − 2 p_{-1},p_{-2} p−1,p−2关联的边,就是德劳内三角剖分。

算法 DelaunayTriangleTion§
输入:由平面上n+1个点组成的一个集合P
输出:P的一个德劳内三角剖分
1 令 p 0 p_0 p0为P中依字典序最高的点,即,y-坐标最大的点,如果有多个,取x最大的。
2 在 R 2 中选取相距足够远的点 p − 1 和 p − 2 R^2中选取相距足够远的点p_{-1}和p_{-2} R2中选取相距足够远的点p−1和p−2将P完全包含于三角形 p 0 p − 1 p − 2 p_0p_{-1}p_{-2} p0p−1p−2之中。
3 将T初始化为单独一个三角型 p 0 p − 1 p − 2 p_0p_{-1}p_{-2} p0p−1p−2
4 从P中删除 p 0 p_0 p0,对P进行随机排序。
5 for r ← \leftarrow ← 1 to n
6 do(将Pr插入到T中 )
7 找到 p r 所在的三角形 p i p j p k ∈ T p_r所在的三角形p_ip_jp_k \in T pr所在的三角形pipjpk∈T
8 if( p r 落在三角形 p i p j p k p_r落在三角形p_ip_jp_k pr落在三角形pipjpk的内部)
9 then 分别将 p r 与三角形 p i p j p k p_r与三角形p_ip_jp_k pr与三角形pipjpk的三个顶点联接起来(生成三条边,从而将三角形一分为三 )
10 LegalizeEdge( p r , p i p j ‾ , T p_r,\overline{p_ip_j},T pr,pipj,T)
11 LegalizeEdge( p r , p j p k ‾ , T p_r,\overline{p_jp_k},T pr,pjpk,T)
12 LegalizeEdge( p r , p k p i ‾ , T p_r,\overline{p_kp_i},T pr,pkpi,T)
13 else(* p r 正好落在三角形 p i p j p k 的某一条边 ( 不妨设为 p i p j ‾ 上 p_r正好落在三角形p_ip_jp_k的某一条边(不妨设为\overline{p_ip_j}上 pr正好落在三角形pipjpk的某一条边(不妨设为pipj上*)
14 将 p r 分别与 p k 以及 p i p j ‾ 关联的另一个三角形的第三个顶点 p l 联接起来 将p_r分别与p_k以及\overline{p_ip_j}关联的另一个三角形的第三个顶点p_l联接起来 将pr分别与pk以及pipj关联的另一个三角形的第三个顶点pl联接起来
(* 从而将于 p i p j ‾ 相关联的那两个三角形划分成四个三角形 从而将于\overline{p_ip_j}相关联的那两个三角形划分成四个三角形 从而将于pipj相关联的那两个三角形划分成四个三角形 *)
15 LegalizeEdge( p r , p i p l ‾ , T p_r,\overline{p_ip_l},T pr,pipl,T)
16 LegalizeEdge( p r , p l p j ‾ , T p_r,\overline{p_lp_j},T pr,plpj,T)
17 LegalizeEdge( p r , p j p k ‾ , T p_r,\overline{p_jp_k},T pr,pjpk,T)
18 LegalizeEdge( p r , p k p i ‾ , T p_r,\overline{p_kp_i},T pr,pkpi,T)
19 将点 p − 1 p − 2 以及与之关联的所有边从 T 中删除 p_{-1}p_{-2}以及与之关联的所有边从T中删除 p−1p−2以及与之关联的所有边从T中删除
20 return (T)
算法 LegalizeEdge( p r , p i p j ‾ , T p_r,\overline{p_ip_j},T pr,pipj,T)
1 (* p r 为插入的点, p i p j ‾ 为 T 中可能需要翻转的一条边 p_r为插入的点,\overline{p_ip_j}为T中可能需要翻转的一条边 pr为插入的点,pipj为T中可能需要翻转的一条边 *)
2 if( p i p j p_ip_j pipj是非法的)
3 then 令 p i p j p k 为沿着 p i p j ‾ p_ip_jp_k为沿着\overline{p_ip_j} pipjpk为沿着pipj与 p r p i p j p_rp_ip_j prpipj相邻的三角形
4 将原来的边 p i p j ‾ 替换成 p r p k ‾ \overline {p_ip_j}替换成\overline{p_rp_k} pipj替换成prpk
5 LegalizeEdge( p r , p i p k ‾ , T p_r,\overline{p_ip_k},T pr,pipk,T
6 LegalizeEdge( p r , p j p k ‾ , T p_r,\overline{p_jp_k},T pr,pjpk,T
其中,第2行要检查某条边的合法性。通常,利用引理9.4的结论完成这一测试。

该算法不会陷入死循环--这是因为,每经过一次翻转,三角剖分的角度向量总是会单调地增长。
引理9.10 :无论是由算法DelaunayTriangleTion生成的边,还是在插入点 p r p_r pr的过程中生成的边,都是 Ω ∪ p 1 ⋯ p r 的德劳内三角剖分中的边 \Omega \cup {p_1\cdots p_r}的德劳内三角剖分中的边 Ω∪p1⋯pr的德劳内三角剖分中的边。
首先 :考察将 △ p i p j p k (可能还有三角形 p i p j p i )分割开来的边 p ‾ r p i 、 p ‾ r p j 、 p r p k ‾ (也可能还有 p r p l ‾ )。既然在 p r 插入之前, p i p j p k 是合法的三角形,故任意 t < r ,点 p t 都不可能落在 p i p j p k 的外接圆 C 内。我们可以将 C 收缩为 C ′ ,这个圆包含于 C 之中,且穿过 p i 和 p r 。 C ′ 必然是空的。这说明,在插入 p r 之后 p r p i ‾ 必然是合法边 \triangle p_ip_jp_k(可能还有三角形p_ip_jp_i)分割开来的边\overline p_rp_i、\overline p_rp_j、\overline{p_rp_k}(也可能还有\overline{p_rp_l})。既然在p_r插入之前,p_ip_jp_k是合法的三角形,故任意t<r,点p_t都不可能落在p_ip_jp_k的外接圆C内。我们可以将C收缩为C',这个圆包含于C之中,且穿过p_i和p_r。C'必然是空的。这说明,在插入p_r之后\overline{p_rp_i}必然是合法边 △pipjpk(可能还有三角形pipjpi)分割开来的边prpi、prpj、prpk(也可能还有prpl)。既然在pr插入之前,pipjpk是合法的三角形,故任意t<r,点pt都不可能落在pipjpk的外接圆C内。我们可以将C收缩为C′,这个圆包含于C之中,且穿过pi和pr。C′必然是空的。这说明,在插入pr之后prpi必然是合法边其它线段同理。

令三角形ABC是已有三角形,D是新点,以CD中点为圆心,CD为直径的圆,经过CD,且不包括 p 1 ⋯ r − 1 p_{1\cdots r-1} p1⋯r−1中的点,将圆心向CD的法向方向移动无穷小,扩大圆的半径使得圆经过CD。不断迭代知直到有其它点在圆上。此时圆内无其它点。

接下来考察LegalizeEdge翻转的任一条边。如图9-19所示,每经过一次翻转,都会将某个三角形 p i p j p k 的边 p i p j ‾ 替换为 p r 相关联的另一条边 p r p l ‾ p_ip_jp_k的边\overline{p_ip_j}替换为p_r相关联的另一条边\overline{p_rp_l} pipjpk的边pipj替换为pr相关联的另一条边prpl在插入点 p r p_r pr之前, p i p j p k p_ip_jp_k pipjpk是一个德劳内三角形,而且 p r 落在该三角形的外接圆之内 p_r落在该三角形的外接圆之内 pr落在该三角形的外接圆之内。因此,我们总是能够将该外接圆收缩为另一个圆,使得除了 p r 和 p l p_r和p_l pr和pl落在其边界上之外,这个圆是空的。
为了确定 p r p_r pr落在那个三角形之中,可以模仿第6章的方法:构造德劳内三角剖分的同时构造一个点定位结构D。
对于任意一对点 p : = ( x p , y p ) , q : = ( x q , y q ) ,若 y p > y q ,或者 y p = y q 且 x q > x p p:=(x_p,y_p),q:=(x_q,y_q),若y_p>y_q,或者y_p=y_q且x_q > x_p p:=(xp,yp),q:=(xq,yq),若yp>yq,或者yp=yq且xq>xp,则称p高于q。
分别取位于整个点集P之下、之上的一对水平线 l − 1 和 l − 2 。假想在 l − 1 上取 p − 1 ,沿着 l − 1 向右移动 p − 1 , l_{-1}和l_{-2}。假想在l_{-1}上取p_{-1},沿着l_{-1}向右移动p_{-1}, l−1和l−2。假想在l−1上取p−1,沿着l−1向右移动p−1, 直到它不再落在 P 中任何三个点的外接圆内,并使 P 中各点相对于 p − 1 的极角次序与它们的字典序完全一致。 直到它不再落在P中任何三个点的外接圆内,并使P中各点相对于p_{-1}的极角次序与它们的字典序完全一致。 直到它不再落在P中任何三个点的外接圆内,并使P中各点相对于p−1的极角次序与它们的字典序完全一致。 在 l − 2 上任取 p − 2 ,左移 p − 1 ,直到它不在落在 P ∪ { p − 1 } 任何三点的外接圆内,并且使 P ∪ p − 1 中各点相对于 p − 2 的极角次序,与它们的字典序一致 在l_{-2}上任取p_{-2},左移p_{-1},直到它不在落在P \cup\{p_{-1}\}任何三点的外接圆内,并且使P\cup {p_{-1}}中各点相对于p_{-2}的极角次序,与它们的字典序一致 在l−2上任取p−2,左移p−1,直到它不在落在P∪{p−1}任何三点的外接圆内,并且使P∪p−1中各点相对于p−2的极角次序,与它们的字典序一致。
4 分析
引理9.11 :由算法DelaunayTriangletion生成的三角形,总数目的期望值不超过9n+1。
证明 :在算法的第r轮迭代中,我们要插入 p r p_r pr。首先要对一个或两个三角形进行细分,得到三个或四个新的三角形。在LegalizeEdge过程中,我们每翻转一条边,也会生成两个新的三角形。在插入点 p r 之后,若 D G r 中与 p r 关联的边数为 k p_r之后,若DG_r中与p_r关联的边数为k pr之后,若DGr中与pr关联的边数为k,则我们所生成的三角形的数目不会超过2(k-3)+3=2k-3。其实,k也就是 p r 在 D G r 中的度数;记作 d e g ( p r , D G r ) p_r在DG_r中的度数;记作deg(p_r,DG_r) pr在DGr中的度数;记作deg(pr,DGr)。我们需要界定的,是 P r P_r Pr中的一个随机成员--点 p r p_r pr的期望度数。根据定理7.3,德劳内图中至多包含3(r+3)-6条边。将三角形 p − 1 p − 2 p − 3 p_{-1}p_{-2}p_{-3} p−1p−2p−3的三条边从中排除掉, p r p_r pr中各顶点度数的总和要小于 2 × 3 ( r + 3 ) − 9 = 6 r 2\times 3(r+3)-9=6r 2×3(r+3)−9=6r也就是说, p r p_r pr中任一随机点的期望度数为6。将上述分析结论综合起来,我们就可以这样来界定在第r步中生成三角形的数目:
{ E 第 r 步生成的三角形数目 ≤ E 2. d e g ( p r , D G r ) − 3 = 2 × E d e g p r , D G r ) − 3 ≤ 2 × 6 − 3 = 9 \begin{cases} E第r步生成的三角形数目\\ \le E2.deg(p_r,DG_r)-3\\ =2 \times Edegp_r,DG_r)-3\\ \le 2\times 6 -3\\ =9\\ \end{cases} ⎩ ⎨ ⎧E第r步生成的三角形数目≤E2.deg(pr,DGr)−3=2×Edegpr,DGr)−3≤2×6−3=9
定理9.12 :任意给定由平面上n各点组成的一个集合P,我们都可以使用O(n)的期望空间,在O(nlogn)的期望时间内构造出P的德劳内三角剖分。
关于期望的证明先放放,定理9.13也放放。

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