三角剖分
在幾何中,三角剖分是指將平面對象細分為三角形,並且通過擴展將高維幾何對象細分為單純形。 對於一個給定的點集,有很多種三角剖分,如:
OI 中的三角剖分主要指二維幾何中的完美三角剖分(二維 Delaunay 三角剖分,簡稱 DT)。
Delaunay 三角剖分
定義
在數學和計算幾何中,對於給定的平面中的離散點集 \(P\),其 Delaunay 三角剖分 DT(\(P\)) 滿足:
- 空圓性:DT(\(P\)) 是 唯一 的(任意四點不能共圓),在 DT(\(P\)) 中,任意 三角形的外接圓範圍內不會有其它點存在。
- 最大化最小角:在點集 \(P\) 可能形成的三角剖分中,DT(\(P\)) 所形成的三角形的最小角最大。從這個意義上講,DT(\(P\)) 是 最接近於規則化 的三角剖分。具體的説是在兩個相鄰的三角形構成凸四邊形的對角線,在相互交換後,兩個內角的最小角不再增大。

性質
- 最接近:以最接近的三點形成三角形,且各線段(三角形的邊)皆不相交。
- 唯一性:不論從區域何處開始構建,最終都將得到一致的結果(點集中任意四點不能共圓)。
- 最優性:任意兩個相鄰三角形構成的凸四邊形的對角線如果可以互換的話,那麼兩個三角形六個內角中最小角度不會變化。
- 最規則:如果將三角剖分中的每個三角形的最小角進行升序排列,則 Delaunay 三角剖分的排列得到的數值最大。
- 區域性:新增、刪除、移動某一個頂點只會影響鄰近的三角形。
- 具有凸邊形的外殼:三角剖分最外層的邊界形成一個凸多邊形的外殼。
構造 DT 的分治算法
DT 有很多種構造算法,在 \(O(n \log n)\) 的構造算法中,分治算法是最易於理解和實現的。
分治構造 DT 的第一步是將給定點集按照 \(x\) 座標 升序 排列,如下圖是排好序的大小為 \(10\) 的點集。
一旦點集有序,我們就可以不斷地將其分成兩個部分(分治),直到子點集大小不超過 \(3\)。然後這些子點集可以立刻剖分為一個三角形或線段。
然後在分治回溯的過程中,已經剖分好的左右子點集可以依次合併。合併後的剖分包含 LL-edge(左側子點集的邊)。RR-edge(右側子點集的邊),LR-edge(連接左右剖分產生的新的邊),如圖 LL-edge(灰色),RR-edge(紅色),LR-edge(藍色)。對於合併後的剖分,為了維持 DT 性質,我們 可能 需要刪除部分 LL-edge 和 RR-edge,但我們在合併時 不會 增加 LL-edge 和 RR-edge。
合併左右兩個剖分的第一步是插入 base LR-edge,base LR-edge 是 最底部 的不與 任何 LL-edge 及 RR-edge 相交的 LR-edge。
然後,我們需要確定下一條 緊接在 base LR-edge 之上的 LR-edge。比如對於右側點集,下一條 LR-edge 的可能端點(右端點)為與 base LR-edge 右端點相連的 RR-edge 的另一端點(\(6, 7, 9\) 號點),左端點即為 \(2\) 號點。
對於可能的端點,我們需要按以下兩個標準檢驗:
- 其對應 RR-edge 與 base LR-edge 的夾角小於 \(180\) 度。
- base LR-edge 兩端點和這個可能點三點構成的圓內不包含任何其它 可能點。
如上圖,\(6\) 號可能點所對應的綠色圓包含了 \(9\) 號可能點,而 \(7\) 號可能點對應的紫色圓則不包含任何其它可能點,故 \(7\) 號點為下一條 LR-edge 的右端點。
對於左側點集,我們做鏡像處理即可。
當左右點集都不再含有符合標準的可能點時,合併即完成。當一個可能點符合標準,一條 LR-edge 就需要被添加,對於與需要添加的 LR-edge 相交的 LL-edge 和 RR-edge,將其刪除。
當左右點集均存在可能點時,判斷左邊點所對應圓是否包含右邊點,若包含則不符合;對於右邊點也是同樣的判斷。一般只有一個可能點符合標準(除非四點共圓)。
當這條 LR-edge 添加好後,將其作為 base LR-edge 重複以上步驟,繼續添加下一條,直到合併完成。
代碼
實現
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | |
Voronoi 圖
Voronoi 圖由一組由連接兩鄰點直線的垂直平分線組成的連續多邊形組成,根據 \(n\) 個在平面上不重合種子點,把平面分成 \(n\) 個區域,使得每個區域內的點到它所在區域的種子點的距離比到其它區域種子點的距離近。
Voronoi 圖是 Delaunay 三角剖分的對偶圖,可以使用構造 Delaunay 三角剖分的分治算法求出三角網,再使用最左轉線算法求出其對偶圖實現在 \(O(n \log n)\) 的時間複雜度下構造 Voronoi 圖。
題目
SGU 383 Caravans 三角剖分 + 倍增
ContestHunter. 無盡的毀滅 三角剖分求對偶圖建 Voronoi 圖
Codeforces Gym 103485M. Constellation collection 三角剖分之後建圖進行 Floodfill
參考資料與拓展閲讀
- Wikipedia - Triangulation (geometry)
- Wikipedia - Delaunay triangulation
- Samuel Peterson -Computing Constrained Delaunay Triangulations in 2-D (1997-98)
本页面最近更新:,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:xehoth
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用