Python德勞內(nèi)三角剖分詳解
初步認(rèn)識(shí)
對(duì)于熟悉matplotlib三維畫圖的人來說,最常用的應(yīng)該是plot_surface,但這個(gè)函數(shù)的繪圖邏輯是,將xy平面映射到z軸,所以沒法一次性繪制球,只能把球分成兩半,上半球和下半球分別繪制。
如果想一次性繪制封閉圖形,則可通過tri_surface,其繪圖邏輯便是將圖形拆分成一個(gè)個(gè)三角面,然后在對(duì)這些三角面進(jìn)行繪制。所以,將一個(gè)曲面拆分成三角面,便構(gòu)成了一個(gè)非?,F(xiàn)實(shí)的問題,德勞內(nèi)三角剖分便是建立在這個(gè)問題背景之下的。
scipy.spatial中提供了Delaunay類,下面以二維散點(diǎn)為例,來初步認(rèn)識(shí)一下。
import numpy as np import matplotlib.pyplot as plt from scipy.spatial import Delaunay pts = np.array([[0, 0], [0, 1], [2, 0], [2, 1]]) tri = Delaunay(pts) plt.triplot(pts[:,0], pts[:,1], tri.simplices) plt.plot(pts[:,0], pts[:,1], 'o') plt.show()
效果如下

構(gòu)造函數(shù)和屬性
Delaunay的構(gòu)造函數(shù)如下
Delaunay(points, furthest_site=False, incremental=False, qhull_options=None)
各參數(shù)含義為
- points 輸入散點(diǎn)
- furthest_site 為True時(shí),計(jì)算最遠(yuǎn)點(diǎn)
- incremental 為True時(shí),允許增量添加點(diǎn)
- qhull_options 為qhull參數(shù),具體可參考qhull
在Delaunay對(duì)象中,有下面幾個(gè)必須知道的常用屬性
- points 即輸入的點(diǎn)集
- simplices 三角面頂點(diǎn)在點(diǎn)集中的序號(hào)
- neighbors 三角面相鄰三角面的序號(hào)
- equations 三角面方程
實(shí)戰(zhàn)-畫個(gè)球
想要畫個(gè)球,第一步是要得到一個(gè)球
# N為點(diǎn)數(shù)
def getBall(N):
pts = []
while len(pts) < N:
while True:
u = np.random.uniform(-1, 1)
v = np.random.uniform(-1, 1)
r2 = u**2 + v**2
if r2 < 1:
break
x = 2*u*np.sqrt(1-r2)
y = 2*v*np.sqrt(1-r2)
z = 1 - 2*r2
pts.append((x,y,z))
return np.vstack(pts)下面測(cè)試一下
pts = getBall(200) ax = plt.subplot(projection='3d') ax.scatter(pts[:,0], pts[:,1], pts[:,2]) plt.show()

接下來將這些隨機(jī)點(diǎn)生成三角面,并進(jìn)行繪圖
tri = Delaunay(pts)
ax = plt.subplot(projection='3d')
for i in tri.simplices:
ax.plot_trisurf(pts[i, 0], pts[i, 1], pts[i,2])
plt.show()
效果如下

看上去花花綠綠的這些三角形,便是通過德勞內(nèi)三角剖分得到的,其equations屬性可以查看這些三角面的方程參數(shù)
>>> tri.equations
array([[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16],
[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16],
[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16],
...,
[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16],
[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16],
[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
-1.00000000e+00, 2.41181971e-16]])
``到此這篇關(guān)于Python德勞內(nèi)三角剖分詳解的文章就介紹到這了,更多相關(guān)Python德勞內(nèi)三角剖分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python開發(fā)的單詞頻率統(tǒng)計(jì)工具wordsworth使用方法
wordsworth是字母,單詞和n元組頻率分析,用來分析文件中的單詞出現(xiàn)頻率的工具。2014-06-06
Python中關(guān)于面向?qū)ο笾欣^承的詳細(xì)講解
面向?qū)ο缶幊?(OOP) 語言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展2021-10-10
用實(shí)例說明python的*args和**kwargs用法
python的*args和**kwargs如何用,看了下面的例子你就清楚了。2013-11-11
python3 自動(dòng)打印出最新版本執(zhí)行的mysql2redis實(shí)例
這篇文章主要介紹了python3 自動(dòng)打印出最新版本執(zhí)行的mysql2redis實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python 實(shí)現(xiàn)socket服務(wù)端并發(fā)的四種方式
這篇文章主要介紹了python 實(shí)現(xiàn)socket服務(wù)端并發(fā)的四種方式,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
python實(shí)現(xiàn)定時(shí)任務(wù)的八種方式總結(jié)
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),下面這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)定時(shí)任務(wù)的八種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01

