JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

神經定理、德勞內三角剖分與佛羅諾伊圖

一個由互相重疊的塊狀區域所建出的組合複形,憑什麼可以替代它們所覆蓋的真實形狀?神經定理回答了這個問題,而佛羅諾伊/德勞內這一對搭檔,則把這個抽象食譜變成了整個計算幾何中最常用的構造。

離散化的許可證:神經記錄了什麼

上一篇導引倚靠著一個承諾:一個由點雲建出的組合複形,能忠實地承載其底下連續形狀的拓撲。本篇就來償還這個承諾。先從一族覆蓋某個空間的集合 U_1, ..., U_n 出發——把它們想成以取樣資料點為心、半徑固定的圓球,它們的聯集是一團加厚的塊狀物。這個覆蓋的神經是個純組合的小裝置:為每個 U_i 放一個頂點、為每一對真的有重疊的 U_i, U_j 放一條邊、為每一組有共同交集的三元組放一個三角形,一般而言,為每個其集合共有一點的 (k+1) 元組放一個 k-單純形。沒有任何幾何資訊留存下來——只剩下誰與誰相遇的模式。

cover by three overlapping disks U_1, U_2, U_3

  U_1 cap U_2 nonempty  ->  edge {1,2}
  U_2 cap U_3 nonempty  ->  edge {2,3}
  U_1 cap U_3 nonempty  ->  edge {1,3}
  U_1 cap U_2 cap U_3 = empty   ->  NO triangle {1,2,3}

  nerve = hollow triangle (a loop)   ==>  H_1 detects one hole

  if instead all three share a point:
  U_1 cap U_2 cap U_3 nonempty  ->  fill triangle {1,2,3}   ==>  no hole
三個兩兩重疊、但三重交集為空的圓盤,給出一個空心的神經三角形——一個圈——而這恰恰發生在它們的聯集中央有個洞的時候。

這個構造的重點在於它是可計算的:判斷哪些集合的元組相交,是有限的組合學;而這些集合的聯集卻是一塊雜亂的連續區域。所以神經是一座橋,把你畫得出的幾何,連到你算得出的代數——而整個問題就在於:跨過這座橋,會不會弄丟什麼。

神經定理,以及它不可妥協的假設

神經定理說這座橋是安全的——但只在一個尖銳的條件下成立。如果這個覆蓋是好覆蓋,意思是每一個非空的交集 U_{i_0} ∩ ... ∩ U_{i_k} 都是可縮的(它能連續地收縮到一點——沒有洞、沒有缺塊,就只是一團拓撲上的塊狀物),那麼這個神經就與這些集合的聯集同倫等價。同倫等價恰好是不多不少的力道:它意味著神經與聯集擁有相同的基本群、相同的同調、相同的貝蒂數——所有對形變不變的拓撲都一致,儘管一個是有限的單純複形,另一個是 R^n 中的連續區域。

這正是持續同調那篇所缺的那塊論證。尺度 epsilon 處的切赫複形,恰恰就是半徑 epsilon/2 的球所成覆蓋的神經;在 R^n 中這些球是凸的,凸集的交集仍是凸的、因而可縮,所以好覆蓋的假設自動成立,於是這個切赫神經與球的聯集同倫等價。這正是為什麼切赫複形確實算出了加厚點雲的拓撲,也是為什麼那個較廉價的維托里斯–里普斯複形值得我們對它保持誠實——里普斯只記錄兩兩的重疊、它不是任何東西的神經,所以它只是把切赫夾住,而非與之相等。

佛羅諾伊圖:那個典範的好覆蓋

在你給神經定理餵進一個典範覆蓋之前,它都還是抽象的;而計算幾何提供了一個你能想到的最自然的覆蓋。給定平面上的一組有限站點 p_1, ..., p_n,佛羅諾伊圖依「最近的站點」來分割平面:p_i 的佛羅諾伊胞是所有嚴格地比起任何其他站點更靠近 p_i 的點所成之集。每個胞都是若干半平面的交集(每個對手站點一個,取在 p_i 那一側、由垂直平分線劃出的半平面),所以每個佛羅諾伊胞都是一個凸多邊形——在整個配置的邊緣處可能無界。

想像地圖上撒下三家咖啡店。佛羅諾伊圖就是「從這裡出發哪一家最近?」的答案——它把整座城市切成三塊領地。一條佛羅諾伊邊是恰好與兩家店等距的點之集(兩塊領地之間的圍籬);一個佛羅諾伊頂點則與三家或更多店等距(三塊領地相會的角)。正是這種「最近鄰分割」的讀法,讓佛羅諾伊圖無處不在:基地台覆蓋、模擬晶體的晶界、最近鄰搜尋,甚至從零散的雨量計推估降雨。

德勞內:產生良形網格的對偶

現在來建這些佛羅諾伊胞的神經——但要用閉胞,它們確實沿著共有的邊界互相重疊。兩個胞沿一條邊相會,三個胞在一個頂點相會,而(在一般位置下)絕不會四個同時相會。這個覆蓋的神經就是德勞內三角剖分:每個站點一個頂點、為兩個其胞相鄰的站點連一條邊、為三個其胞共有一頂點的站點接一個三角形。因此德勞內三角剖分佛羅諾伊圖的組合對偶——佛羅諾伊頂點對應德勞內三角形、佛羅諾伊邊對應德勞內邊、佛羅諾伊胞對應德勞內頂點,恰恰把維度翻轉。

對偶很優雅,但德勞內在實務中之所以站得住腳,靠的是單一一條幾何性質:空外接圓條件。三個站點構成的三角形是德勞內三角形,恰恰當通過其三頂點的圓在內部不含任何其他站點時成立。(那個圓的圓心正是它們共有的佛羅諾伊頂點——它與三個站點等距、且不比其他任何站點更近——所以這兩個描述是同一個事實、只是從對偶的兩側各看一眼。)正是這個局部的判準,讓德勞內無需畫出任何一個佛羅諾伊胞就能被建構出來。

計算它:抬升到拋物面

有一個漂亮的把戲,把整個平面問題化約成一個你早已熟悉的問題——高一維的凸包。把平面上的每個站點 (x, y) 抬升到 R^3 中拋物面 z = x^2 + y^2 上的點 (x, y, x^2 + y^2)。這些被抬升的點的下凸包——你從底下往上看會看到的那些面——筆直地投影回去,就是德勞內三角剖分。原因是精確的、而非近似的:一個平面與拋物面相截成一個橢圓,這橢圓投影到 (x, y) 平面上是一個圓,而上方的「點落在平面下方」對應到下方的「點落在圓內」。於是空外接圓的判準,就變成了凸包的尋常「位於某面之下」的判準。

  1. 抬升:把每個站點 (x_i, y_i) 映到 (x_i, y_i, x_i^2 + y_i^2),把所有站點都放到 R^3 的拋物面上。
  2. 求包:用一個標準的凸包演算法(增量法、禮品包裝法或分治法)計算被抬升之點的凸包。
  3. 留下底部:丟棄上方的面;那些朝下的面,正是其外接圓為空的那些面。
  4. 投影:把下凸包各面的 z 座標丟掉,即讀出德勞內三角剖分,再取對偶便得到佛羅諾伊圖。

正是這個抬升,使得 n 個站點的平面德勞內三角剖分能在 O(n log n) 時間內算出——它承襲了平面凸包的最優複雜度。它同時也是本梯級反覆出現的主題最乾淨的例證:一個困難的幾何問題,在換對視角之後就變容易了。也請留意凸包的現身,以及潛伏在一般位置背後的組合保證,如關於凸集族何時必相交的赫利定理——撐起好覆蓋假設的那份凸性,正是組織起這個演算法的同一份凸性。

誠實的提醒,以及這一切的落點

有幾個假設值得明白地說出口,而非含混帶過。第一,一般位置:對偶的乾淨只在沒有四個站點共圓、且沒有三個共線時成立。當四個站點共有一個外接圓時,它們共同的佛羅諾伊頂點的次數是四,而德勞內「三角剖分」就含有一個帶兩條合法對角線的四邊形——作為胞複形,這個對偶是良定義的,但三角剖分不再唯一。實作會用一個符號擾動來打破這個平手;而數學則只是誠實地承認這份歧義。

第二,維度。上面的一切都推廣到 R^d——佛羅諾伊胞變成凸多胞形、德勞內變成由單純形構成的三角剖分、抬升則改到 R^(d+1) 的拋物面——但複雜度不再那麼友善:R^d 中 n 個點的德勞內三角剖分可能有約 n^(ceil(d/2)) 個單純形,所以那個在平面上是 O(n log n) 的構造,到了三維變成平方階、之後迅速更糟。維度的詛咒在這裡是真實的,這也是為什麼高維的拓撲資料分析寧可倚靠較廉價的里普斯複形,儘管它的保證較弱。

退一步,看著整個梯級閉合成一個迴圈。第一篇在一張網格的頂點上找到了藏身的曲率;第二、三篇在它上面跑微積分與拉普拉斯算子;第四篇看著洞跨越各個尺度誕生與死亡——而本篇則同時提供了為那種觀看背書的定理(神經定理,連同它不可妥協的好覆蓋假設),以及一開始就產生良形網格的那個構造(經由佛羅諾伊而來的德勞內)。反覆出現的教訓,正是離散微分幾何開篇時的同一個:凸性與正確的組合對偶,把連續幾何變成電腦能精確計算的東西——只要你對假設保持誠實。