首頁>科技>

導讀:VTK是一個功能非常強大的資料視覺化工具,全球在工業軟體,醫學影像等方面有30%以上的市場覆蓋率。

本文講解第一個最為簡單的功能點雲。內容分為三個部分。

1、建立點雲

2、生成正弦隨機序列

3、為點雲建立箭頭

4、為背景增加圖片

5、為點雲建立背景網格

最後的效果,如下圖

1、建立點雲

使用Pyvista建立點雲,非常簡單,只要生成一列點的座標,即可生成點雲。

所謂點雲,就是由很多點組成的一個集合

程式碼如下

import numpy as npimport pyvista as pvnodes = np.random.rand(100, 3)mesh = pv.PolyData(nodes)p = pv.Plotter()  # 建一個視窗p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()

生成一個隨機的點雲,只需要2行也就是第3行和第四行。

第3行,生成座標矩陣

第4行,生成網格。

第5行開始,是視窗的設定,首先新建一個視窗

第6行,將網格載入到視窗內,並設定點的大小,和顏色,這裡是用球來顯示的。

第7行,show

這個效果已經出來了,但是看起來不是很舒服。我們可以改一下背景顏色。比如改成白色

import numpy as npimport pyvista as pvnodes = np.random.rand(100, 3)mesh = pv.PolyData(nodes)p = pv.Plotter()  # 建一個視窗p.background_color = (1,1,1) # 設定背景顏色p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()

上面的第6行,將背景顏色修改為白色。

這樣一個點雲,從建立到顯示就已經完成了。

2、生成正弦隨機序列

隨機的0-1之間的點雲,可能不是我們所想的,我們希望這個隨機是基於一個基本的背景的隨機,比如一個正弦函式。

於是,我們還需要對隨機序列進行一個修改。大家看一下程式碼大概就像知道我要做什麼了。我們將這個隨機變成一個正弦函式的擾動

import mathnodes = np.random.rand(100, 3)for i in range(100):    nodes[i,0] += i*0.5    nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10mesh = pv.PolyData(nodes)

點座標的部分,我們修改為上面的幾行。其實只是增加了一個正弦函式,在x,y方向上的值的疊加。如圖

這樣的隨機也許是我們經常會遇到的。實際上這個背景,我們可以根據我們的需要去調整。例如我們就是有一個很好的資料背景,我就想看看增加了隨機之後的效果,我們仍然可以按這個方式來操作。

3、為點雲建立箭頭視覺化

我們當然也希望在這個點雲上有一些其他的視覺化的操作,比如對資料的操作等。如果為每一個點給一個方向,這其實就是這個點雲上的向量場了

import numpy as npimport pyvista as pvimport mathnodes = np.random.rand(100, 3)for i in range(100):    nodes[i,0] += i*0.5    nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10mesh = pv.PolyData(nodes)direction = np.zeros((100,3))for i in range(100):    mag = abs(nodes[i,0])+abs(nodes[i,1])    mag = 1*max(mag,1e-20)    direction[i,0]=(0-nodes[i,0])/mag    direction[i, 1] = (0 - nodes[i, 1])/mag    direction[i, 2] = 0p = pv.Plotter()  # 建一個視窗p.background_color = (1,1,1) # 設定背景顏色p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.add_arrows(nodes,direction,color = 'blue')p.show()

9-15行,增加了一個direction的向量場,也就是給每一個點賦予了方向。

19行,將箭頭加入到視窗

4、為背景增加圖片

這個背景過於單調,我們也可以將背景設定成圖片,只需要直接設定背景圖片就可以了。

p.add_background_image('./space.jpg')

這裡找了一個太空圖,你也可以自己選擇一個喜歡的圖形。

5、為點雲建立背景網格

總覺得這樣效果還不是很好,我能不能為點雲建立一個背景面呢?

當然可以。

我們只需要增加一個平面作為背景就可以。

import numpy as npimport pyvista as pvimport mathnodes = np.random.rand(100, 3)for i in range(100):    nodes[i,0] += i*0.5    nodes[i, 1] += 0.2*math.sin(i*np.pi / 10) * 10floor = pv.Plane(center=[25, 0, -1], direction=[0, 0, 1], i_size=60, j_size=20,                 i_resolution=30, j_resolution=10)direction = np.zeros((100,3))for i in range(100):    mag = abs(nodes[i,0])+abs(nodes[i,1])    mag = 1*max(mag,1e-20)    direction[i,0]=(0-nodes[i,0])/mag    direction[i, 1] = (0 - nodes[i, 1])/mag    direction[i, 2] = 0mesh = pv.PolyData(nodes)p = pv.Plotter() # 建一個視窗# p.camera_position = [(6,3,7),#                      (0,0,2),#                      (-0.2,1,-0.2)]# p.background_color = (1,1,1) # 設定背景顏色p.add_background_image('./space.jpg')p.add_axes()p.add_mesh(floor,color='gray',edge_color="green",show_edges=True)p.add_arrows(nodes,direction,color = 'blue')p.add_mesh(mesh,color='red',point_size=5, render_points_as_spheres=True)p.show()

第9行建立了一個plane的網格。

第27行,將這個網格加入到視窗,並且設定顏色,邊的顏色,設定邊可見。

注意:

第26行,我們將座標軸也加進去了。

這樣就得到了我們開始給大家演示的效果。

這裡,我們對背景網格,做了一個透明度設定。

p.add_mesh(floor,color='gray',edge_color="green",show_edges=True,opacity=0.5)

也就是這個opacity的引數。0是完全不可見,1是完全可見。

6、結束

點雲,是視覺化裡最為簡單的操作了。但是加上其他的效果之後,也許就不是那麼簡單了。

只要稍微修改一下正弦的背景值,效果會非常好看。

17
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 蘋果,平板電腦市場排名第一,三星第二