Delaunay三角剖分算法初探

Delaunay三角網在空間鄰近分析上是一種較好的支持模型, 廣泛應用於空間聚類、多邊形羣的合併、人像關鍵點提取、形態分析中。

在這裏插入圖片描述

問題:一堆二維點中尋找一個與目標點最近(歐氏距離最小)的點。

1. 三角剖分與Delaunay剖分的定義

   如何把一個散點集合剖分成不均勻的三角形網格,這就是散點集的三角剖分問題,散點集的三角剖分,對數值分析以及圖形學來說,都是極爲重要的一項預處理技術。該問題圖示如下:
   在這裏插入圖片描述

1.1. 三角剖分定義

  【定義】三角剖分:假設V是二維實數域上的有限點集,邊e是由點集中的點作爲端點構成的封閉線段, E爲e的集合。那麼該點集V的一個三角剖分T=(V,E)是一個平面圖G,該平面圖滿足條件:

  1. 除了端點,平面圖中的邊不包含點集中的任何點。
  2. 沒有相交邊。
  3. 平面圖中所有的面都是三角面,且所有三角面的合集是散點集V的凸包。

1.2. Delaunay三角剖分的定義

  在實際中運用的最多的三角剖分是Delaunay三角剖分,它是一種特殊的三角剖分。先從Delaunay邊說起:
  【定義】Delaunay邊:假設E中的一條邊e(兩個端點爲a,b),e若滿足下列條件,則稱之爲Delaunay邊:存在一個圓經過a,b兩點,圓內(注意是圓內,圓上最多三點共圓)不含點集V中任何其他的點,這一特性又稱空圓特性。
  【定義】Delaunay三角剖分:如果點集V的一個三角剖分T只包含Delaunay邊,那麼該三角剖分稱爲Delaunay三角剖分。

1.3.Delaunay三角剖分的準則

  要滿足Delaunay三角剖分的定義,必須符合兩個重要的準則:

  1. 空圓特性:Delaunay三角網是唯一的(任意四點不能共圓),在Delaunay三角形網中任一三角形的外接圓範圍內不會有其它點存在。如下圖所示:
       在這裏插入圖片描述

  2. 最大化最小角特性:在散點集可能形成的三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大。從這個意義上講,Delaunay三角網是“最接近於規則化的“的三角網。具體的說是指在兩個相鄰的三角形構成凸四邊形的對角線,在相互交換後,六個內角的最小角不再增大。如下圖所示:

   在這裏插入圖片描述

1.4.Delaunay三角剖分的特性

   以下是Delaunay剖分所具備的優異特性:

  1. 最接近:以最近臨的三點形成三角形,且各線段(三角形的邊)皆不相交。
  2. 唯一性:不論從區域何處開始構建,最終都將得到一致的結果。
  3. 最優性:任意兩個相鄰三角形形成的凸四邊形的對角線如果可以互換的話,那麼兩個三角形六個內角中最小的角度不會變大。
  4. 最規則:如果將三角網中的每個三角形的最小角進行升序排列,則Delaunay三角網的排列得到的數值最大。
  5. 區域性:新增、刪除、移動某一個頂點時只會影響臨近的三角形。
  6. 具有凸多邊形的外殼:三角網最外層的邊界形成一個凸多邊形的外殼。

1.5.局部最優化處理

  理論上爲了構造Delaunay三角網,Lawson提出的局部優化過程LOP(Local Optimization Procedure),一般三角網經過LOP處理,即可確保成爲Delaunay三角網,其基本做法如下所示:

  1. 將兩個具有共同邊的三角形合成一個多邊形。
  2. 以最大空圓準則作檢查,看其第四個頂點是否在三角形的外接圓之內。
  3. 如果在,修正對角線即將對角線對調,即完成局部優化過程的處理。
      LOP處理過程如下圖所示:

   在這裏插入圖片描述

2.Delaunay剖分的算法

  Delaunay剖分是一種三角剖分的標準,實現它有多種算法。

2.1.Lawson算法

  逐點插入的Lawson算法是Lawson在1977年提出的,該算法思路簡單,易於編程實現。基本原理爲:首先建立一個大的三角形或多邊形,把所有數據點包圍起來,向其中插入一點,該點與包含它的三角形三個頂點相連,形成三個新的三角形,然後逐個對它們進行空外接圓檢測,同時用Lawson設計的局部優化過程LOP進行優化,即通過交換對角線的方法來保證所形成的三角網爲Delaunay三角網。
  上述基於散點的構網算法理論嚴密、唯一性好,網格滿足空圓特性,較爲理想。由其逐點插入的構網過程可知,遇到非Delaunay邊時,通過刪除調整,可以構造形成新的Delaunay邊。在完成構網後,增加新點時,無需對所有的點進行重新構網,只需對新點的影響三角形範圍進行局部聯網,且局部聯網的方法簡單易行。同樣,點的刪除、移動也可快速動態地進行。但在實際應用當中,這種構網算法當點集較大時構網速度也較慢,如果點集範圍是非凸區域或者存在內環,則會產生非法三角形。

2.2.Bowyer-Watson算法

  Lawson算法的基本步驟是:
  1. 構造一個超級三角形,包含所有散點,放入三角形鏈表。
  2. 將點集中的散點依次插入,在三角形鏈表中找出其外接圓包含插入點的三角形(稱爲該點的影響三角形),刪除影響三角形的公共邊,將插入點同影響三角形的全部頂點連接起來,從而完成一個點在Delaunay三角形鏈表中的插入。
  3. 根據優化準則對局部新形成的三角形進行優化。將形成的三角形放入Delaunay三角形鏈表。
  4. 循環執行上述第2步,直到所有散點插入完畢。
  這一算法的關鍵的第2步圖示如下:
在這裏插入圖片描述

Ref:
[圖形算法]Delaunay三角剖分算法
https://zhuanlan.zhihu.com/p/42331420

scipy API - scipy.spatial.Delaunay


python示例:

用 Python 實現 Delaunay Triangulation

# 
# http://fangs.in/post/python/pythondelaunay/
#
from scipy.spatial import Delaunay
import numpy as np
import matplotlib.pyplot as plt

# Triangle Settings
width = 200
height = 120
pointNumber = 32 # 設置值in 10 to 1000
points = np.zeros((pointNumber, 2))
points[:, 0] = np.random.randint(0, width, pointNumber)
points[:, 1] = np.random.randint(0, height, pointNumber)

# Use scipy.spatial.Delaunay for Triangulation
tri = Delaunay(points)
# print(tri.simplices)
# Plot Delaunay triangle with color filled
center = np.sum(points[tri.simplices], axis=1)/3.0
color = np.array([(x - width/2)**2 + (y - height/2)**2 for x, y in center])
plt.figure(figsize=(10, 6))
plt.tripcolor(points[:, 0], points[:, 1], tri.simplices.copy(), facecolors=color, edgecolors='k')

# Delete ticks, axis and background
# plt.tick_params(labelbottom='off', labelleft='off', left='off', right='off',
#                 bottom='off', top='off')
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')

# Save picture
# plt.savefig('Delaunay2.png', transparent=True, dpi=600)
plt.show()

輸出圖片:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章