Python實(shí)現(xiàn)繪制凸包的示例代碼
ConvexHull
ConvexHull是spatial中的一個(gè)類(lèi),主要功能是找到一組點(diǎn)的邊緣,并做一個(gè)凸包。其必要的初始化參數(shù)為一個(gè)點(diǎn)集,點(diǎn)集格式為n×m維度的數(shù)組,n為點(diǎn)集中點(diǎn)的個(gè)數(shù),m為點(diǎn)的維度。
from scipy.spatial import ConvexHull import matplotlib.pyplot as plt import numpy as np pts = np.random.rand(30, 2) hull = ConvexHull(pts) plt.plot(pts[:,0], pts[:,1], 'o') for i in hull.simplices: plt.plot(pts[i, 0], pts[i, 1], 'k-') plt.show()
其中simplex
為索引點(diǎn)的序號(hào),繪圖之后效果如下
ConvexHull有兩個(gè)可選參數(shù),其中,incremental為布爾型參數(shù),當(dāng)其為T(mén)rue時(shí),允許添加新的點(diǎn)。
qhull_options的具體參數(shù)可以查看qhull,下面只演示一下QG。
QG
QGn表示將第n個(gè)點(diǎn)視為觀察點(diǎn),在對(duì)點(diǎn)集進(jìn)行凸包劃分后,如果把頂點(diǎn)連接起來(lái),當(dāng)作一個(gè)圍墻,那么觀察點(diǎn)可以看得到的點(diǎn),則標(biāo)記為good,其效果如下所示
pts = np.random.rand(1000, 2) # 添加一個(gè)觀察點(diǎn) pts = np.vstack([pts, np.array([[2,0.5]])]) hull = ConvexHull(pts, qhull_options='QG1000') plt.plot(pts[:,0], pts[:,1], '.') for i in hull.simplices: plt.plot(pts[i, 0], pts[i, 1], 'k-') for i in hull.simplices[hull.good]: plt.plot(pts[i, 0],pts[i, 1], lw=5) plt.show()
效果如圖所示
三維情況
二維情況下的凸包,很明顯是由線構(gòu)成的一個(gè)封閉圖形,而三維情況下的凸包,自然應(yīng)該是一個(gè)三維幾何體。拓展到任意維度,凸包構(gòu)成的實(shí)際上是一個(gè)單形,ConvexHull中的simplices便是構(gòu)成單形的點(diǎn),在原點(diǎn)集中的索引。示例如下
pts = np.random.rand(30, 3) hull = ConvexHull(pts) ax = plt.subplot(projection='3d') ax.scatter(pts[:,0], pts[:,1], pts[:,2]) for i in hull.simplices: ax.plot_trisurf(pts[i, 0], pts[i, 1], pts[i,2], alpha=0.5) ???????plt.show()
其中alpha參數(shù)用于調(diào)整三角面的透明度,從而可以透過(guò)凸包,看到凸包內(nèi)部的點(diǎn)。
效果如下
ConvexHull屬性
前面已經(jīng)引入了單形的概念,即凸包構(gòu)成的圖形便是單形。作為二維情況下的凸包,是由線段圍成;三維情況下的凸包,則是由平面圍成;推廣到任意維度,可以表述為構(gòu)成凸包的單形,由超曲面圍成。由于超曲面這個(gè)概念并沒(méi)有邊界,所以具有頂點(diǎn)、邊緣的凸包表面,下文中通稱(chēng)為單形超表面。
ConvexHull類(lèi)中常用的屬性如下
- points 凸包包圍的點(diǎn)集
- vertices 單形頂點(diǎn)在點(diǎn)集中的索引
- simplices 單形超表面頂點(diǎn)
- neighbors 超表面相鄰超表面的索引
- equations 超曲面方程的參數(shù)
三維情況下的超曲面方程示例如下,即每個(gè)超曲面有4個(gè)參數(shù)
>>> hull.equations array([[-0.5509472 , 0.72386104, -0.41530999, -0.36369123], [-0.26155355, 0.16210178, -0.95147925, 0.02022163], [-0.99132368, -0.0460725 , 0.12310441, 0.045523 ], [-0.98526526, -0.07170442, 0.15527666, 0.04749854], [-0.15900968, -0.98529789, -0.06248198, 0.13294496], # .......
到此這篇關(guān)于Python實(shí)現(xiàn)繪制凸包的示例代碼的文章就介紹到這了,更多相關(guān)Python繪制凸包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)戰(zhàn)之百度智能云使人像動(dòng)漫化
這篇文章主要介紹了python實(shí)戰(zhàn)之百度智能云使人像動(dòng)漫化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-04-04Python字符串格式化format()方法運(yùn)用實(shí)例
這篇文章主要給大家介紹了關(guān)于Python字符串格式化format()方法運(yùn)用實(shí)例的相關(guān)資料,字符串格式化是Python編程中十分常用的部分,它可以幫助我們將更具可讀性的數(shù)據(jù)輸出到控制臺(tái)或?qū)懭胛募?需要的朋友可以參考下2023-08-08Django模板變量如何傳遞給外部js調(diào)用的方法小結(jié)
這篇文章主要給大家介紹了關(guān)于Django模板變量如何傳遞給外部js調(diào)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-07-07python Manager 之dict KeyError問(wèn)題的解決
今天小編就為大家分享一篇python Manager 之dict KeyError問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python常用標(biāo)準(zhǔn)庫(kù)詳解(pickle序列化和JSON序列化)
這篇文章主要介紹了Python常用標(biāo)準(zhǔn)庫(kù),主要包括pickle序列化和JSON序列化模塊,通過(guò)使用場(chǎng)景分析給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05使用Python制作一個(gè)簡(jiǎn)易的遠(yuǎn)控終端
這篇文章主要為大家詳細(xì)介紹了如何使用Python語(yǔ)言制作一個(gè)簡(jiǎn)易的遠(yuǎn)控終端,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-04-04Django中更改默認(rèn)數(shù)據(jù)庫(kù)為mysql的方法示例
這篇文章主要介紹了Django中更改默認(rèn)數(shù)據(jù)庫(kù)為mysql的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12搭建pypi私有倉(cāng)庫(kù)實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了搭建pypi私有倉(cāng)庫(kù)實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11