主頁 > 後端開發 > 十分鐘玩轉3D繪圖:WxGL完全手冊

十分鐘玩轉3D繪圖:WxGL完全手冊

2020-10-11 00:05:59 後端開發

文章目錄

  • 1. 前言
    • 1.1 WxGL是什么?
    • 1.2 為什么選擇WxGL?
    • 1.3 安裝和依賴關系
  • 2. 快速體驗
    • 2.1 從正弦曲線開始
    • 2.2 使用2D模式
    • 2.3 子圖布局
    • 2.4 標題和文本
    • 2.5 Colorbar
    • 2.6 顏色的表示
    • 2.7 顏色映射表
  • 3. 互動式繪圖函式
    • 3.1 新建畫布:figure()
    • 3.2 保存畫布為檔案:savefig()
    • 3.3 顯示畫布:show()
    • 3.4 數值顏色映射:cmap()
    • 3.5 添加子圖:subplot()
    • 3.6 繪制點和線:plot()函式
    • 3.7 繪制散點圖:scatter()函式
    • 3.8 繪制mesh:mesh()
    • 3.9 繪制surface:surface()
    • 3.10 繪制圓管:pipe()
    • 3.11 繪制球體:sphere()
    • 3.12 繪制六面體:cube()
    • 3.13 繪制圓柱體:cylinder()
    • 3.14 繪制圓錐體:cone()
    • 3.15 繪制三維等值面:capsule()
    • 3.16 繪制流體:flow()
    • 3.17 繪制標題:title()
    • 3.18 繪制文本:text()
    • 3.19 繪制Colorbar:colorbar()
    • 3.20 繪制網格和刻度:ticks()
  • 4. 應用示例
    • 4.1 surface()函式的應用
      • 4.1.1 扇面
      • 4.1.2 紋理
    • 4.2 mesh()函式的應用
      • 4.2.1 曲面
      • 4.2.2 球面
    • 4.3 三維等值面
    • 4.4 地形圖
    • 4.5 雪花飄飄
  • 5. 與wxPython集成
    • 5.1 WxGLScene API
      • 5.1.1 建構式
      • 5.1.2 設定眼睛與目標點之間的相對關系
      • 5.1.3 恢復初始姿態
      • 5.1.4 保存場景為影像檔案
      • 5.1.5 添加視區
      • 5.1.6 添加子圖
      • 5.1.7 自動旋轉
      • 5.1.8 停止旋轉
    • 5.2 WxGLRegion API
      • 5.2.1 建構式
      • 5.2.2 重置視區
      • 5.2.3 設定坐標軸范圍
      • 5.2.4 洗掉模型
      • 5.2.5 顯示模型
      • 5.2.6 隱藏模型
      • 5.2.7 更新視區顯示
      • 5.2.8 創建紋理物件
      • 5.2.9 繪制2D文字
      • 5.2.10 繪制3D文字
      • 5.2.11 繪制點
      • 5.2.12 繪制線段
      • 5.2.13 繪制曲面
      • 5.2.14 繪制網格
      • 5.2.15 繪制球體
      • 5.2.16 繪制六面體
      • 5.2.17 繪制圓錐體
      • 5.2.18 繪制圓柱體
      • 5.2.19 繪制圓管線
      • 5.2.20 繪制囊(三維等值面)
      • 5.2.21 繪制體資料
      • 5.2.22 繪制坐標軸
      • 5.2.23 繪制colorBar
      • 5.2.24 繪制網格和刻度
      • 5.2.25 隱藏刻度網格
      • 5.2.26 繪制2D網格和刻度
      • 5.2.27 繪制流體
    • 5.3 應用示例

1. 前言

1.1 WxGL是什么?

WxGL是一個基于PyOpenGL的三維資料可視化庫,以wx為顯示后端,提供Matplotlib風格的互動式應用模式,同時,也可以和wxPython無縫結合,在wx的表單上繪制三維模型,

WxGL遵循MIT開源軟體許可協議,任何人都可以使用、復制和修改本軟體,甚至出版發行、再授權以及販售本軟體,唯一的限制是,必須附有MIT授權協議,WxGL的原始碼和本文的示例代碼、資源,都可以從https://github.com/xufive/wxgl下載,

從V0.6.2開始,WxGL新增了互動式繪圖子模塊wxplot,提供類似Matplotlib風格的2D/3D繪圖函式,如果熟悉NumPy和Matplotlib的話,只需要幾分鐘時間就可以學會使用WxGL的互動式繪圖,

1.2 為什么選擇WxGL?

WxGL提供了一套簡潔易用、對用戶友好的API,將OpenGL的復雜概念全部封裝起來,使得用戶可以專注于資料的處理,而無需將更多精力用在3D顯示方面,可以說,WxGL是為實作資料快速可視化而誕生的,下面這個例子可以告訴你,WxGL究竟有多簡潔,

>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> vs = np.array([
    [1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
    [-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1], 
    [-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1], 
    [1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')

前兩行代碼匯入NumPy和WxGL模塊,第3行構造資料,第4行繪制,第5行顯示并增加旋轉效果,只要5行代碼,就可以實作下面的效果,

在這里插入圖片描述

1.3 安裝和依賴關系

和其他的Python模塊一樣,WxGL模塊也使用pip命令安裝,

pip install wxgl

WxGL依賴以下模塊,如果當前運行環境沒有安裝這些模塊,安裝程式將會自動安裝它們,如果安裝程序出現問題,或者安裝完成后無法正常使用,請嘗試手動安裝WxGL的依賴模塊,

  • numpy(推薦版本:1.18.2或更高)
  • scipy(推薦版本:1.4.1或更高)
  • freetype(推薦版本:2.1.0.post1)
  • matplotlib(推薦版本:3.1.2或更高)
  • wxpython(推薦版本:4.0.7.post2或更高)
  • pyopengl(推薦版本:3.1.3b2或更高)

2. 快速體驗

下面例子中用到的繪圖函式,在本文第3部分“互動式繪圖函式”中均有詳細的使用說明,

2.1 從正弦曲線開始

>>> import numpy as np
>>> import wxgl.wxplot as plt
>>> x = np.linspace(0, 2*np.pi, 361)
>>> y = np.sin(x) * 3
>>> plt.plot(x, y)
>>> plt.show()

上面這幾行代碼,畫出了一條正弦曲線,如果忽略模塊名的話,這些代碼和Matplotlib是完全一樣的,除去匯入模塊和資料準備,真正的繪圖陳述句只有最后兩行,執行最后一句show()命令后,將彈出GUI視窗,同時程式將阻塞,直至關閉GUI視窗,

在這里插入圖片描述

2.2 使用2D模式

對于2D資料來說,使用2D模式繪制,看起來會更習慣一點,

>>> theta = np.linspace(0, 2*np.pi, 361)
>>> x = 3 * np.cos(theta)
>>> y = 3 * np.sin(theta)
>>> fig = plt.figure(mode='2D')
>>> plt.plot(x, y)
>>> plt.show()

這段代碼,首先準備繪制圓的資料,然后使用wxplot.figure()生成畫布,同時指定使用2D繪圖模式,

在這里插入圖片描述

2.3 子圖布局

WxGL支持在一張畫布上畫多張子圖,創建子圖的方式也非常類似Matplotlib,下面使用wxplot.sphere()函式繪制兩個球體,

  • 創建子圖方式一:
>>> plt.subplot(121) # 一行兩列的第一個位置
>>> plt.sphere((0,0,0), 3, 'green')
>>> plt.subplot(122) # 一行兩列的第二個位置
>>> plt.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
  • 創建子圖方式二:
>>> ax1 = plt.subplot(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = plt.subplot(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()
  • 創建子圖方式三:
>>> fig = plt.figure()
>>> ax1 = fig.add_axes(121) # 一行兩列的第一個位置
>>> ax1.sphere((0,0,0), 3, 'green')
>>> ax2 = fig.add_axes(122) # 一行兩列的第二個位置
>>> ax2.sphere((0,0,0), 3, '#00FFFF', mode='FCBC')
>>> plt.show()

上面三種方式創建的子圖,繪制效果是完全一致的,圖中的網格線和標注,是通過點擊工具列上的工具按鈕生成的,再次點擊則可以隱藏,工具列按鈕從左至右,分別是:恢復初始姿態、顯示/隱藏坐標軸、顯示/隱藏網格刻度、設定配色方案、保存為檔案,

在這里插入圖片描述
除了可以接受3位數字的引數外,subplot()和add_axes()還可以接受4元組引數,用來指定子圖左下角在畫布上的位置,以及子圖的寬度和高度,

2.4 標題和文本

和Matplotlib類似,wxplot也提供了title()和text()兩個函式來繪制標題和文本,除了文本內容,這兩個函式還可以接受文本大小、位置、顏色、字體、對齊方式等若干引數,

>>> plt.cube((0,0,0), 3, 'cyan') # 繪制六面體,cyan是顏色,十六進制表示為#00FFFF
>>> plt.sphere((0,0,0), 1.5, 'orange') # 繪制球
>>> plt.cylinder((0,0,-2), (0,0,2), 0.5, 'green') # 繪制圓柱
>>> plt.cone((0,-2,0), (0,2,0), 0.5, 'purple') # 繪制圓錐,purple是顏色,十六進制表示為#F020F0
>>> plt.title('六面體、圓錐、圓柱和球的組合') # 繪制標題
>>> plt.text('這是錐尖', size=40, pos=(0,2,0), align='left') # 繪制文本
>>> plt.show()

繪制六面體、圓錐、圓柱和球的函式將在本文的第3部分給出詳細的API說明,

在這里插入圖片描述

2.5 Colorbar

只需要提供值域范圍、顏色映射表名字,wxplot.colorbar()就可以輕松畫出Colorbar,默認位置在畫布或子圖的右側,使用引數loc可以指定Colorbar的位置,

>>> x, y = np.mgrid[-1:1:20j,-1:1:20j]
>>> z = x*x + y*y
>>> plt.mesh(x, y, z, mode='FLBL', cmap='hsv') # 其實,mesh()函式默認使用的顏色映射表就是hsv
>>> plt.colorbar((z.min(), z.max()), 'hsv') # colorbar()的顏色映射表要和要和繪圖函式一致
>>> plt.show()

這段代碼使用wxplot.mesh()函式畫出了曲面 z = x 2 + y 2 z = x^2 + y^2 z=x2+y2的樣子(x和y取值均在在[-1,1]之間),mesh()函式默認使用的顏色映射表是hsv,因此,colorbar的顏色映射表也使用相同的名字

在這里插入圖片描述

2.6 顏色的表示

表示多個顏色時,WxGL限定使用NumPy陣列,也就是numpy.ndarray型別,顏色陣列的最后一個維度表示顏色通道,可以是RGB模式,也可以是RGBA模式,各個顏色通道的值域范圍在[0,1]之間,

表示單個顏色時,WxGL支持串列、元組或陣列的表示形式(值域范圍限定在[0,1]之間),也支持類似"#FF00FF"的十六進制表示法,此外,WxGL還提供了若干預定義的顏色,使用plt.fig.cm.colors可以查看所有的預定義顏色,

>>> plt.fig.cm.colors
{'red': '#FF0000', 'red_dark': '#C00000', 'green': '#00C000', 'green_dark': '#008000', 'blue': '#0000FF', 'blue_dark': '#0000C0', 'yellow': '#FFFF00', 'orange': '#FFA500', 'purple': '#F020F0', 'purple_dark': '#C000C0', 'cyan': '#00FFFF', 'cyan_dark': '#00C0C0', 'gray': '#C0C0C0', 'dark': '#808080', 'black': '#000000', 'white': '#FFFFFF'}
  • red: #FF0000,紅色
  • red_dark: #C00000,暗紅色
  • green: #00C000,綠色
  • green_dark: #008000,暗綠色
  • blue: #0000FF,藍色
  • blue_dark: #0000C0,暗藍色
  • yellow: #FFFF00,黃色
  • orange: #FFA500,橘色
  • purple: #F020F0,紫色
  • purple_dark: #C000C0,暗紫色
  • cyan: #00FFFF,青色
  • cyan_dark: #00C0C0,暗青色
  • gray: #C0C0C0,淺灰色
  • dark: #808080,深灰色
  • black: #000000,黑色
  • white: #FFFFFF,白色

2.7 顏色映射表

WxGL預定了若干顏色映射方案,使用plt.fig.cm.cms.keys()可以查看所有的預定義顏色映射表,

dict_keys([
    'autumn', 'brg', 'CMRmap', 'cool', 'cubehelix', 
    'gist_earth', 'gist_rainbow', 'gist_stern', 
    'gnuplot', 'gray', 'gray_r', 'hsv', 'jet', 
    'ocean', 'rainbow', 'spring', 'summer', 
    'terrain', 'winter', 'Wistia', 'wind'
])

3. 互動式繪圖函式

wxplot函式自帶完備的檔案說明,只需要使用__doc__查看即可,

3.1 新建畫布:figure()

>>> print(plt.figure.__doc__)
    新建畫布
    Useage: figure(*args, **kwds)
    ----------------------------------------------------
    size        - 畫布解析度,默認800x600
    kwds        - 關鍵字引數
                    head        - 定義方向:'x+'|'y+'|'z+'
                    zoom        - 視口縮放因子
                    mode        - 2D/3D模式
                    elevation   - 仰角
                    azimuth     - 方位角
                    style       - 配色方案,'black'|'white'|'gray'|'blue'

3.2 保存畫布為檔案:savefig()

>>> print(plt.savefig.__doc__)
    保存畫布為檔案
    Useage: savefig(fn, alpha=False)
    ----------------------------------------------------
    fn          - 檔案名
    alpha       - 透明通道開關

3.3 顯示畫布:show()

>>> print(plt.savefig.__doc__)
    顯示畫布
    Useage: show(rotation=None, **kwds)
    ----------------------------------------------------
    rotation    - 旋轉模式
                    None        - 無旋轉
                    'h+'        - 水平順時針旋轉(默認方式)
                    'h-'        - 水平逆時針旋轉
                    'v+'        - 垂直前翻旋轉
                    'v-'        - 垂直后翻旋轉
    kwds        - 關鍵字引數
                    elevation   - 初始仰角,以度(°)為單位,默認值為0
                    azimuth     - 初始方位角以度(°)為單位,默認值為0
                    step        - 幀增量,以度(°)為單位,默認值為5
                    interval    - 幀間隔,以ms為單位,默認值為20

3.4 數值顏色映射:cmap()

>>> print(plt.cmap.__doc__)
    數值顏色映射
    Useage: cmap(data, cm, **kwds)
    ----------------------------------------------------
    data        - 資料
    cm          - 顏色映射表名
    kwds        - 關鍵字引數
                    invalid     - 無效資料的標識
                    invalid_c   - 無效資料的顏色
                    datamax     - 資料最大值,默認為None
                    datamin     - 資料最小值,默認為None
                    alpha       - 透明度,None表示回傳RGB格式

3.5 添加子圖:subplot()

>>> print(plt.subplot.__doc__)
    添加子圖
    Useage: subplot(pos, padding=(20,20,20,20))
    ----------------------------------------------------
    pos         - 子圖在畫布上的位置和大小
                    三位數字    - 指定分割畫布的行數、列數和子圖序號,例如,223表示兩行兩列的第3個位置
                    四元組      - 以畫布左下角為原點,寬度和高度都是1,四元組分別表示子圖左下角在畫布上的水平、垂直位置和寬度、高度
    padding     - 四元組,上、右、下、左四個方向距離邊緣的留白像素

3.6 繪制點和線:plot()函式

>>> print(plt.plot.__doc__)
    繪制點和線
    Useage: plot(xs, ys, zs=None, color=None, size=0.0, width=1.0, style='solid', cmap='hsv', caxis='z')
    ----------------------------------------------------
    xs/ys/zs    - 頂點的x/y/z坐標集,元組、串列或一維陣列型別,長度相等,若zs為None,則自動補為全0的陣列
    color       - 全部或每一個頂點的顏色,None表示使用cmap引數映射顏色
    size        - 頂點的大小,整型或浮點型,若為0,則表示不繪制點,只繪制線
    width       - 線寬,0.0~10.0之間的浮點數,若為0,則表示不繪制線,只繪制點
    style       - 線型
                    'solid'     - 實線
                    'dashed'    - 虛線
                    'dotted'    - 點線
                    'dash-dot'  - 虛點線
    cmap        - 顏色映射表,color為None時有效
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.7 繪制散點圖:scatter()函式

>>> print(plt.scatter.__doc__)
    繪制散點圖
    Useage: scatter(vs, color=None, size=1.0, cmap='hsv', caxis='z')
    ----------------------------------------------------
    vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    size        - 頂點的大小,整型或浮點型
    cmap        - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.8 繪制mesh:mesh()

>>> print(plt.mesh.__doc__)
    繪制mesh
    Useage: mesh(xs, ys, zs, color=None, mode='FCBC', cmap='hsv', caxis='z', light=None)
    ----------------------------------------------------
    xs/ys/zs    - 頂點的x/y/z坐標集,二維陣列
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    cmap        - 顏色映射表,color為None時有效,使用zs映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'
    light       - 材質燈光顏色,None表示關閉材質燈光

3.9 繪制surface:surface()

>>> print(plt.surface.__doc__)
    繪制surface
    Useage: surface(vs, color=None, method='Q', mode='FCBC', texture=None, alpha=True, light=None)
    ----------------------------------------------------
    vs          - 頂點坐標集,二維陣列型別,shape=(n,3)
    color       - 頂點顏色或顏色集,可以混合使用紋理,None表示僅使用紋理
    method      - 繪制方法
                    'Q'         - 四邊形
                                    0--3 4--7
                                    |  | |  |
                                    1--2 5--6
                    'T'         - 三角形
                                    0--2 3--5
                                     \/   \/
                                      1    4
                    'Q+'        - 邊靠邊的連續四邊形
                                   0--2--4
                                   |  |  |
                                   1--3--5
                    'T+'        - 邊靠邊的連續三角形
                                   0--2--4
                                    \/_\/_\
                                     1  3  5
                    'F'         - 扇形
                    'P'         - 多邊形
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    texture     - 用于紋理的影像檔案,僅當method為Q時有效
    alpha       - 紋理是否使用透明通道,僅當texture存在時有效
    light       - 材質燈光顏色,None表示關閉材質燈光

3.10 繪制圓管:pipe()

>>> print(plt.pipe.__doc__)
    繪制圓管
    Useage: pipe(vs, radius, color=None, slices=36, mode='FCBC', cmap='hsv', caxis='z')
    ----------------------------------------------------
    vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    radius      - 圓管半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 圓管面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    cmap        - 顏色映射表,color為None時有效,使用vs的z坐標映射顏色
    caxis       - 用于顏色映射的坐標軸資料,2D模式下自動轉為'y'

3.11 繪制球體:sphere()

>>> print(plt.sphere.__doc__)
    繪制球體
    Useage: sphere(center, radius, color, slices=60, mode='FLBL')
    ----------------------------------------------------
    center      - 球心坐標,元組、串列或陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 球面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.12 繪制六面體:cube()

>>> print(plt.cube.__doc__)
    繪制六面體
    Useage: cube(center, side, color, mode='FLBL')
    ----------------------------------------------------
    center      - 中心坐標,元組、串列或陣列
    side        - 棱長,整型、浮點型,或長度為3的元組、串列陣列
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.13 繪制圓柱體:cylinder()

>>> print(plt.cylinder.__doc__)
    繪制圓柱體
    Useage: cylinder(v_top, v_bottom, radius, color, slices=60, mode='FCBC')
    ----------------------------------------------------
    v_top       - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
    v_bottom    - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 圓柱面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.14 繪制圓錐體:cone()

>>> print(plt.cone.__doc__)
    繪制圓錐體
    Useage: cone(center, spire, radius, color, slices=60, mode='FCBC')
    ----------------------------------------------------
    center      - 錐底圓心坐標,元組、串列或陣列
    spire       - 錐尖坐標,元組、串列或陣列
    radius      - 半徑,浮點型
    color       - 頂點顏色或顏色集,None表示使用cmap引數映射顏色
    slices      - 錐面分片數(數值越大越精細)
    mode        - 顯示模式
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC

3.15 繪制三維等值面:capsule()

>>> print(plt.capsule.__doc__)
    繪制囊(三維等值面)
    Useage: capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode='FCBC', **kwds)
    ----------------------------------------------------
    data        - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
    threshold   - 閾值,浮點型
    color       - 表面顏色
    r_x         - x的動態范圍,元組
    r_y         - y的動態范圍,元組
    r_z         - z的動態范圍,元組
    mode        - 顯示模式
                    None        - 使用當前設定
                    'FCBC'      - 前后面填充顏色FCBC
                    'FLBL'      - 前后面顯示線條FLBL
                    'FCBL'      - 前面填充顏色,后面顯示線條FCBL
                    'FLBC'      - 前面顯示線條,后面填充顏色FLBC
    kwds        - 關鍵字引數
                    name        - 模型名
                    inside      - 是否更新資料動態范圍
                    visible     - 是否顯示

3.16 繪制流體:flow()

>>> print(plt.flow.__doc__)
    繪制流體
    Useage: flow(ps, us, vs, ws, **kwds)
    ----------------------------------------------------
    ps          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
    us          - 頂點u分量集,numpy.ndarray型別,shape=(n,)
    vs          - 頂點v分量集,numpy.ndarray型別,shape=(n,)
    ws          - 頂點w分量集,numpy.ndarray型別,shape=(n,)
    kwds        - 關鍵字引數
                    color       - 軌跡線顏色,None表示使用速度映射顏色
                    actor       - 頂點模型型別,'point'|'line'兩個選項
                    size        - point大小
                    width       - line寬度
                    length      - 軌跡線長度,以速度矢量的模為單位
                    duty        - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
                    frames      - 總幀數
                    interval    - 幀間隔,以ms為單位
                    threshold   - 高通閾值,濾除速度小于閾值的資料點
                    name        - 模型名

3.17 繪制標題:title()

>>> print(plt.title.__doc__)
    繪制標題
    Useage: title(text, size=96, color=None, pos=(0,0,0), **kwds)
    ----------------------------------------------------
    text        - 文本字串
    size        - 文字大小,整形
    color       - 文本顏色,預定義的顏色,或長度為3的串列或元組
    pos         - 文本位置,list或numpy.ndarray型別,shape=(3)
    kwds        - 關鍵字引數
                    align       - left/right/center分別表示左對齊、右對齊、居中(默認)
                    valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
                    family      - (系統支持的)字體
                    weight      - light/bold/normal分別表示字體的輕、重、正常(默認)

3.18 繪制文本:text()

>>> print(plt.text.__doc__)
    繪制文本
    Useage: text(text, size=64, color=None, pos=(0,0,0), **kwds)
    ----------------------------------------------------
    text        - 文本字串
    size        - 文字大小,整形
    color       - 文本顏色,預定義的顏色,或長度為3的串列或元組
    pos         - 文本位置,list或numpy.ndarray型別,shape=(3)
    kwds        - 關鍵字引數
                    align       - left/right/center分別表示左對齊、右對齊、居中(默認)
                    valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
                    family      - (系統支持的)字體
                    weight      - light/bold/normal分別表示字體的輕、重、正常(默認)

3.19 繪制Colorbar:colorbar()

>>> print(plt.colorbar.__doc__)
    繪制colorbar
    Useage: colorbar(drange, cmap, loc, **kwds)
    ----------------------------------------------------
    drange      - 值域范圍,tuple型別
    cmap        - 調色板名稱
    loc         - 位置,top|bottom|left|right
    kwds        - 關鍵字引數
                    length          - ColorBar所在視區的長邊長度,默認短邊長度為1
                    subject         - 標題
                    subject_size    - 標題字號
                    label_size      - 標注字號
                    label_format    - 標注格式化所用lambda函式
                    tick_line       - 刻度線長度
                    endpoint        - 刻度是否包含值域范圍的兩個端點值
                    name            - 模型名
                    inside          - 是否資料動態范圍
                    visible         - 是否顯示

3.20 繪制網格和刻度:ticks()

>>> print(plt.ticks.__doc__)
    繪制網格和刻度
    Useage: subplot(**kwds)
    ----------------------------------------------------
    kwds        - 關鍵字引數
                    segment_min     - 標注最少分段數量
                    segment_max     - 標注最多分段數量
                    label_2D3D      - 標注試用2D3D文字
                    label_size      - 標注字號
                    xlabel_format   - x軸標注格式化所用lambda函式
                    ylabel_format   - y軸標注格式化所用lambda函式
                    zlabel_format   - z軸標注格式化所用lambda函式

4. 應用示例

雖然前面給出了很多幾何體的繪制函式,但三維繪圖絕不只是繪制規則的幾何體,而是要表現紛繁復雜的現實的和虛擬的空間,在三維繪圖函式中,最重要、最常用、同時也是最難以理解的是surface()函式和mesh()函式,

4.1 surface()函式的應用

OpenGL總共有10種圖元繪制方法,如下表所示,其中的前4種方式用于繪制點和線,后6種方式用于繪制面,surface()函式整合了后面的6種圖元繪制方法,使用method引數可以指定繪制方法(詳見3.9節),

引數說明
GL_POINTS繪制一個或多個頂點
GL_LINES繪制線段
GL_LINE_STRIP繪制連續線段
GL_LINE_LOOP繪制閉合的線段
GL_POLYGON繪制多邊形
GL_TRIANGLES繪制一個或多個三角形
GL_TRIANGLE_STRIP繪制連續三角形
GL_TRIANGLE_FAN繪制多個三角形組成的扇形
GL_QUADS繪制一個或多個四邊形
GL_QUAD_STRIP繪制連續四邊形

4.1.1 扇面

使用原生的OpenGL繪圖時,通常需要先準好一組頂點,然后指定使用哪一種方式繪制,這里邊暗含著頂點順序的重要性,以畫扇面為例,需要在15°到165°之間生成弧線上的一組點,假設扇面在 y o z yoz yoz平面上,這些點的x坐標則上下交替,將扇面的圓心點(0,0,0)加到剛才生成的一組點的起始位置,也就是第1個頂點,

>>> theta = np.linspace(np.pi/12, 11*np.pi/12, 21) # 在15°到165°之間生成21個點
>>> y = np.cos(theta) * 10 # 弧線上點的y坐標
>>> z = np.sin(theta) * 10 # 弧線上點的y坐標
>>> x = np.array([i%2-0.5 for i in range(21)]) # 弧線上點的x坐標,上下交替
>>> vs = np.stack((x,y,z), axis=1) # 組合成頂點坐標,此時vs的shape是(21,3)
>>> vs = np.vstack((np.array([0,0,0]), vs)) # 將原點加到vs的首位,此時vs的shape是(22,3)

繪制扇面,就是繪制連續三角形,第1個三角形由頂點1、頂點2、頂點3組成,第2個三角形由頂點1、頂點3、頂點4組成,……,以此類推,

>>> cs = plt.cmap(vs[:,0], 'wind') # 將x的值映射為顏色,使用wind映射表
>>> plt.surface(vs, color=cs, method='F', mode='FLBC')
>>> plt.show(rotation='h+')

這里surface()函式,引數method為’F’,也就是GL_TRIANGLE_FAN的方法,繪制多個三角形組成的扇形;引數mode為’FLBC’,意為前面渲染線條后面渲染顏色,呈現出前后不同的視覺效果,show()函式也使用了自動旋轉引數(詳見3.3節),
在這里插入圖片描述

4.1.2 紋理

surface()函式支持使用紋理,使用默認引數的話,只需要傳入紋理圖片路徑就可以了,

>>> vs = np.array([
    [1,-1,1], [1,-1,-1], [1,1,-1], [1,1,1],
    [-1,1,1], [-1,1,-1], [-1,-1,-1], [-1,-1,1], 
    [-1,-1,1], [-1,-1,-1], [1,-1,-1], [1,-1,1], 
    [1,1,1], [1,1,-1], [-1,1,-1], [-1,1,1]
])
>>> plt.surface(vs, texture=r'example\res\girl.jpg', alpha=False)
>>> plt.show(rotation='h+')

如果你有女朋友的照片,只需要三行代碼就可以做一個這樣的禮物送給她了,要是你有多位女朋友也沒關系,你可以每4個頂點呼叫一次surface()函式,最多可以將6位女朋友的照片貼到一個六面體上,不過,多位女朋友照片組成的六面體,只能自己欣賞,不適合送給女朋友哦,你若因此被某位女朋友揍得鼻青臉腫,可別怪我沒有提前警告過你,

在這里插入圖片描述

4.2 mesh()函式的應用

mesh()函式也是用來繪制曲面的,它和surface()函式的不同之處在于,mesh()函式的頂點是基于一個假象的二維網格,surface()函式需要傳入一組頂點,mesh()函式則需要分別傳入一組頂點的x、y、z坐標,并且對應著假象的二維網格的x、y、z坐標, mesh()函式之所以令人困惑,是因為這個假象的二維網格有時候是真正的資料是重合的,

4.2.1 曲面

先生成一個二維網格的x坐標和y坐標,

>>> y, x = np.mgrid[-2:2:50j,-2:2:50j]
>>> x.shape
(50, 50)
>>> y.shape
(50, 50)

顯然,這是一個50x50的二維網格,x和y的值域范圍都是 [ ? 2 , 2 ] [-2,2] [?2,2],分別令網格的每個點的z坐標都是0,以及 z = 2 x e ? ( x 2 + y 2 ) z=2xe^{-(x^2+y^2)} z=2xe?(x2+y2),繪制兩個曲面,

>>> z1 = np.zeros_like(x)
>>> z2 = 2*x*np.exp(-x**2-y**2)
>>> ax1 = plt.subplot(121)
>>> ax1.mesh(x, y, z1, mode='FLBL')
>>> ax2 = plt.subplot(122)
>>> ax2.mesh(x, y, z2, mode='FLBC')
>>> plt.show()

左側網格和假象的網格是一致的,右側則是我們真正想要繪制的網格

在這里插入圖片描述

4.2.2 球面

先生成球面資料,

>>> lats, lons = np.mgrid[-np.pi/2:np.pi/2:91j, 0:2*np.pi:181j]
>>> xs = np.cos(lats)*np.cos(lons)
>>> ys = np.cos(lats)*np.sin(lons)
>>> zs = np.sin(lats)
>>> xs.shape, ys.shape, zs.shape
((91, 181), (91, 181), (91, 181))

這里,xs、ys、zs分別是球面上點的x、y、z坐標集,同時又都是二維的陣列,對應著一個假象的二維網格,

>>> plt.mesh(xs, ys, zs, color=(0,1,0), light=(0,1,0))
>>> plt.show()

因為使用了燈光引數,所以繪制出的球面有亮暗變化,效果如下,

在這里插入圖片描述
如果將假象的網格視為如下所示的等經緯地圖,就可以將這張圖映射到球面上,

在這里插入圖片描述
地圖的解析度是1000x500,因此假象的網格也是1000x500的解析度,

lats, lons = np.mgrid[-np.pi/2:np.pi/2:500j, 0:2*np.pi:1000j]
xs = np.cos(lats)*np.cos(lons)
ys = np.cos(lats)*np.sin(lons)
zs = np.sin(lats)
im = Image.open(=r'example\res\earth.png')
cs = np.array(im)/255 # 影像顏色值域范圍是[0,255],需要變為[0,1]
plt.mesh(xs, ys, zs, color=cs[::-1]) # 顏色逆序
plt.show(rotation='h-')

我們假象的網格,北極為+90°,南極為-90°,從上而下是遞減的,而上面的地圖資料,行號從上而下是遞增的,因此在傳參是需要逆序,最終效果如下圖所示,

在這里插入圖片描述

4.3 三維等值面

先來構造一個30層高、水平解析度是50x50的資料體,每個格點的資料隨機生成;然后在其中隱藏一個空心圓椎面,設定圓椎面上的格點值為10,

>>> theta = np.linspace(0, 2*np.pi, 180)
>>> _x = np.cos(theta)
>>> _y = np.sin(theta)
>>> data = np.random.random((30,50,50))
>>> for i in range(30):
>>> 	x = _x*i/2 + 25
>>> 	x = x.astype(np.int)
>>> 	y = _y*i/2 + 25
>>> 	y = y.astype(np.int)
>>> 	data[i][(x,y)] = 10

呼叫capsule()函式,即可從資料體找出資料值為10的等值面,

plt.capsule(data, 10, '#C020C0', r_x=(0,50), r_y=(0,50), r_z=(0,30), mode='FCBC')
plt.show()

如果資料體解析度足夠高,等值面就會足夠光滑,

在這里插入圖片描述

4.4 地形圖

從網上可以下載到地形地貌資料,這些資料一般包括經度資料集、緯度資料集、高度資料集和地貌資料集,landforms.npz保存了濟南地區(東經116.65°-117.65°、北緯36.25°-37.00°)的地形地貌資料,使用np.load()可以直接加載,

>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> plt.show()

高度資料的單位是米,經緯度的單位是度,每度相當于100千米,因此高度資料需要除以100000,這里只除以50000,是為了有更好的視覺效果,地貌資料的值域范圍是[0,255],除以255變成[0,1],下圖中濟南市北部(下方)的黃河、南部(上方)的群山都清晰可見,

在這里插入圖片描述

4.5 雪花飄飄

WxGL嘗試使用flow()函式展示粒子系統的部分功能,并使用了可編程管線技術(但并未開放介面),下面的代碼,前半部分是地形繪制,然后在4500米~5000米的高度上隨機生成了500個雪花初始點,并使用u/v/w分量形式指定雪花的降落速度,最后使用flow()函式繪制出雪花飄落的樣子,使用flow()函式需要仔細斟酌各個引數,具體細節詳見3.16節,

>>> data = np.load(=r'example\res\landforms.npz')
>>> lon = data['lon']
>>> lat = data['lat']
>>> height = data['height']
>>> landforms = data['landforms']
>>> lons, lats = np.meshgrid(lon, lat) # 生成經緯度網格
>>> plt.mesh(lons, lats, height/50000, color=landforms/255)
>>> x = 116.65 + np.random.random(500) * (117.65-116.65) # 隨機生成500個雪花點x坐標
>>> y = 36.25 + np.random.random(500) * (37.00-36.25) # 隨機生成500個雪花點y坐標
>>> z = 4500 + np.random.random(500) * 500 # 隨機生成500個雪花點z坐標(4500米~5000米)
>>> vs = np.stack((x,y,z/10000), axis=1) # 合并成500個頂點坐標
>>> u = np.sin(3*x) # 雪花在東西方的速度分量
>>> v = np.cos(4*y) # 雪花在南北方的速度分量
>>> w = -10 - np.random.random(500)  # 雪花垂直方向的速度分量
>>> plt.flow(vs, u/100, v/100, w/100, length=4, frames=30, interval=50, color=(0.8,0.8,0.8), actor='point', size=3)
>>> plt.ticks(zlabel_format=lambda z:'%0.1fkm'%(z*10))
>>> plt.show()

需要特別指出,這段代碼還使用了ticks()函式設定網格和標注,ticks()函式接受lambda函式作為坐標軸標注的格式化函式,這里僅演示了如何格式化z軸的標注,

在這里插入圖片描述

5. 與wxPython集成

WxGL的容器名為WxGLScene,稱為場景,WxGLScene是wx.glcanvas.GLCanvas的派生類,因此WxGL和wxPython的集成是天然無縫的,不存在任何障礙,

每個場景可以使用add_region()生成多個WxGLRegion物件,稱為視區,在視區內可以創建模型,每個模型由一個或多個組件構成——所謂組件,可以理解為子模型,

5.1 WxGLScene API

5.1.1 建構式

WxGLScene.__init__(parent, head=‘z+’, zoom=1.0, proj=‘cone’, mode=‘3D’, style=‘black’, **kwds)

parent      - 父級視窗物件
head        - 觀察者頭部的指向,字串
				'x+'        - 頭部指向x軸正方向
				'y+'        - 頭部指向y軸正方向
				'z+'        - 頭部指向z軸正方向
zoom        - 視口縮放因子
proj        - 投影模式,字串
				'ortho'     - 平行投影
				'cone'      - 透視投影
mode        - 2D/3D模式,字串
style       - 場景風格
				'black'     - 背景黑色,文本白色
				'white'     - 背景白色,文本黑色
				'gray'      - 背景淺灰色,文本深藍色
				'blue'      - 背景深藍色,文本淡青色
kwds        - 關鍵字引數
				elevation   - 仰角
				azimuth     - 方位角

5.1.2 設定眼睛與目標點之間的相對關系

WxGLScene.set_posture(elevation=None, azimuth=None, dist=None, save=False)

elevation   - 仰角(度)
azimuth     - 方位角(度)
dist        - 相機位置與目標點位之間的距離
save        - 是否保存相機姿態

5.1.3 恢復初始姿態

WxGLScene.reset_posture()

無引數

5.1.4 保存場景為影像檔案

WxGLScene.save_scene(fn, alpha=True, buffer=‘FRONT’)

fn          - 保存的檔案名
alpha       - 是否使用透明通道
buffer      - 顯示緩沖區,默認使用前緩沖區(當前顯示內容)

5.1.5 添加視區

WxGLScene.add_region(box, fixed=False)

box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed       - 是否鎖定旋轉縮放

5.1.6 添加子圖

WxGLScene.add_axes(pos, padding=(20,20,20,20))

pos         - 三個數字組成的字串或四元組,表示子圖在場景中的位置和大小
padding     - 四元組,上、右、下、左四個方向距離邊緣的留白像素

5.1.7 自動旋轉

WxGLScene.auto_rotate(rotation=‘h+’, **kwds)

rotation    - 旋轉模式
				'h+'        - 水平順時針旋轉(默認方式)
				'h-'        - 水平逆時針旋轉
				'v+'        - 垂直前翻旋轉
				'v-'        - 垂直后翻旋轉
kwds        - 關鍵字引數
				elevation   - 初始仰角,以度(°)為單位,默認值為0
				azimuth     - 初始方位角以度(°)為單位,默認值為0
				step        - 幀增量,以度(°)為單位,默認值為5
				interval    - 幀間隔,以ms為單位,默認值為20

5.1.8 停止旋轉

WxGLScene.stop_rotate()

無引數

5.2 WxGLRegion API

5.2.1 建構式

WxGLRegion.__init__(scene, rid, box, fixed=False)

scene       - 所屬場景物件
rid         - 唯一標識
box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
fixed       - 是否鎖定旋轉縮放

5.2.2 重置視區

WxGLRegion.reset_box(box, clear=False)

box         - 四元組,元素值域[0,1],四個元素分別表示視區左下角坐標、寬度、高度
clear       - 是否清空所有模型

5.2.3 設定坐標軸范圍

WxGLRegion.set_data_range(r_x=None, r_y=None, r_z=None)

r_x         - 二元組,x坐標軸范圍
r_y         - 二元組,y坐標軸范圍
r_z         - 二元組,z坐標軸范圍

5.2.4 洗掉模型

WxGLRegion.delete_model(name)

name        - 模型名

5.2.5 顯示模型

WxGLRegion.show_model(name)

name        - 模型名

5.2.6 隱藏模型

WxGLRegion.hide_model(name)

name        - 模型名

5.2.7 更新視區顯示

WxGLRegion.refresh()

無引數

5.2.8 創建紋理物件

WxGLRegion.create_texture(img, alpha=True)

img         - 紋理圖片檔案名或資料
alpha       - 是否使用透明通道

5.2.9 繪制2D文字

WxGLRegion.text2d(text, size=32, color=None, pos=[0,0,0], **kwds)

text        - 文本字串
size        - 文字大小,整型
color       - 文本顏色
				None表示使用場景物件scene的style風格提供的文本顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
pos         - 文本位置,元組、串列或numpy陣列
kwds        - 關鍵字引數
				align       - 兼容text3d(),并無實際意義
				valign      - 兼容text3d(),并無實際意義
				family      - (系統支持的)字體
				weight      - light/bold/normal分別表示字體的輕、重、正常(默認)
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.10 繪制3D文字

WxGLRegion.text3d(text, size=32, color=None, pos=[0,0,0], **kwds)

text        - 文本字串
size        - 文字大小,整型
color       - 文本顏色
				None表示使用場景物件scene的style風格提供的文本顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
pos         - 文本位置,元組、串列或numpy陣列
kwds        - 關鍵字引數
				align       - left/right/center分別表示左對齊、右對齊、居中(默認)
				valign      - top/bottom/middle分別表示上對齊、下對齊、垂直居中(默認)
				family      - (系統支持的)字體
				weight      - light/bold/normal分別表示字體的輕、重、正常(默認)
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.11 繪制點

WxGLRegion.point(vs, color, size=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
size        - 點的大小,整數,None表示使用當前設定
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式

5.2.12 繪制線段

WxGLRegion.line(vs, color, method=‘SINGLE’, width=None, stipple=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)|(4,)|(n,3)|(n,4)
method      - 繪制方法
				'MULTI'     - 線段
				'SINGLE'    - 連續線段
				'LOOP'      - 閉合線段
width       - 線寬,0.0~10.0之間,None表示使用當前設定
stipple     - 線型,整數和兩位元組十六進制整陣列成的元組,形如(1,0xFFFF),None表示使用當前設定
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式

5.2.13 繪制曲面

WxGLRegion.surface(vs, color=None, texcoord=None, texture=None, method=‘Q’, mode=None, **kwds)

vs          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
color       - 頂點或頂點集顏色
				None表示僅使用紋理
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(n,3|4)
texcoord    - 頂點的紋理坐標集,numpy.ndarray型別,shape=(n,2)
texture     - 2D紋理物件
method      - 繪制方法
				'Q'         - 四邊形
								0--3 4--7
								|  | |  |
								1--2 5--6
				'T'         - 三角形
								0--2 3--5
								 \/   \/
								  1    4
				'Q+'        - 邊靠邊的連續四邊形
							   0--2--4
							   |  |  |
							   1--3--5
				'T+'        - 邊靠邊的連續三角形
							   0--2--4
								\/_\/_\
								 1  3  5
				'F'         - 扇形
				'P'         - 多邊形
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式
				light       - 材質燈光顏色,None表示關閉材質燈光

5.2.14 繪制網格

WxGLRegion.mesh(xs, ys, zs, color, method=‘Q’, mode=None, **kwds)

xs          - 頂點集的x坐標集,numpy.ndarray型別,shape=(rows,cols)
ys          - 頂點集的y坐標集,numpy.ndarray型別,shape=(rows,cols)
zs          - 頂點集的z坐標集,numpy.ndarray型別,shape=(rows,cols)
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
method      - 繪制方法:
				'Q'         - 四邊形
				'T'         - 三角形
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				blc         - 邊框的顏色,None表示無邊框
				blw         - 邊框寬度
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				program     - 著色器程式
				light       - 材質燈光顏色,None表示關閉材質燈光

5.2.15 繪制球體

WxGLRegion.sphere(center, radius, color, mode=‘FLBL’, slices=60, **kwds)

center      - 球心坐標,元組、串列或numpy陣列
radius      - 半徑,浮點型
color       - 表面顏色
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
slices      - 錐面分片數(數值越大越精細)
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.16 繪制六面體

WxGLRegion.cube(center, side, color, mode=‘FLBL’, **kwds)

center      - 中心坐標,元組、串列或numpy陣列
side        - 棱長,整型、浮點型,或長度為3的元組、串列、numpy陣列
color       - 頂點或頂點集顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(rows,cols,3|4)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.17 繪制圓錐體

WxGLRegion.cone(center, spire, radius, color, slices=50, mode=‘FCBC’, **kwds)

center      - 錐底圓心坐標,元組、串列或numpy陣列
spire       - 錐尖坐標,元組、串列或numpy陣列
radius      - 錐底半徑,浮點型
color       - 圓錐顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3,)
slices      - 錐面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.18 繪制圓柱體

WxGLRegion.cylinder(v_top, v_bottom, radius, color, slices=50, mode=‘FCBC’, **kwds)

v_top       - 圓柱上端面的圓心坐標,元組、串列或numpy陣列
v_bottom    - 圓柱下端面的圓心坐標,元組、串列或numpy陣列
radius      - 圓柱半徑,浮點型
color       - 圓柱顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(2,3|4)
slices      - 圓柱面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				headface    - 是否顯示圓柱端面
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.19 繪制圓管線

WxGLRegion.pipe(vs, radius, color, slices=36, mode=‘FCBC’, **kwds)

vs          - 圓管中心點坐標集,numpy.ndarray型別,shape=(n,3)
radius      - 圓管半徑,浮點型
color       - 圓管顏色
				預定義的顏色,或形如'#FF0000'的十六進制表示的顏色
				浮點型的元組或串列,值域范圍:[0,1],長度:3
				numpy.ndarray型別,shape=(3|4,)|(n,3|4)
slices      - 圓管面分片數(數值越大越精細)
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.20 繪制囊(三維等值面)

WxGLRegion.capsule(data, threshold, color, r_x=None, r_y=None, r_z=None, mode=‘FLBL’, **kwds)

data        - 資料集,numpy.ndarray型別,shape=(layers,rows,cols)
threshold   - 閾值,浮點型
color       - 表面顏色
r_x         - x的動態范圍,元組
r_y         - y的動態范圍,元組
r_z         - z的動態范圍,元組
mode        - 顯示模式
				None        - 使用當前設定
				'FCBC'      - 前后面填充顏色FCBC
				'FLBL'      - 前后面顯示線條FLBL
				'FCBL'      - 前面填充顏色,后面顯示線條FCBL
				'FLBC'      - 前面顯示線條,后面填充顏色FLBC
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示
				light       - 材質燈光開關

5.2.21 繪制體資料

WxGLRegion.volume(data, x=None, y=None, z=None, method=‘Q’, **kwds)

data        - 頂點的顏色集,numpy.ndarray型別,shape=(layers,rows,cols,4)
x           - 頂點的x坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的2軸索引構造
y           - 頂點的y坐標集,numpy.ndarray型別,shape=(rows,cols),預設則使用volume的1軸索引構造
z           - 頂點的z坐標集,numpy.ndarray型別,shape=(layers,),預設則使用volume的0軸索引構造
method      - 繪制方法:
				'Q'         - 四邊形
				'T'         - 三角形
kwds        - 關鍵字引數
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.22 繪制坐標軸

WxGLRegion.coordinate(length=1.0, xlabel=None, ylabel=None, zlabel=None, **kwds)

length      - 坐標軸半軸長度,從-length到length
xlabel      - x軸標注
ylabel      - y軸標注
zlabel      - z軸標注
kwds        - 關鍵字引數
				half        - 是否畫半軸
				slices      - 錐面分片數(數值越大越精細)
				label_size  - 標注文本的字號
				name        - 模型名
				inside      - 是否更新資料動態范圍
				visible     - 是否顯示

5.2.23 繪制colorBar

WxGLRegion.colorbar(drange, cmap, loc=‘right’, **kwds)

drange      - 值域范圍,tuple型別
cmap        - 調色板名稱
loc         - 位置,top|bottom|left|right
kwds        - 關鍵字引數
				length          - ColorBar所在視區的長邊長度,默認短邊長度為1
				subject         - 標題
				subject_size    - 標題字號
				label_size      - 標注字號
				label_format    - 標注格式化所用lambda函式
				tick_line       - 刻度線長度
				endpoint        - 刻度是否包含值域范圍的兩個端點值
				name            - 模型名
				inside          - 是否更新資料動態范圍
				visible         - 是否顯示

5.2.24 繪制網格和刻度

WxGLRegion.ticks(**kwds)

kwds        - 關鍵字引數
				segment_min     - 標注最少分段數量
				segment_max     - 標注最多分段數量
				label_2D3D      - 標注試用2D或3D文字
				label_size      - 標注字號
				xlabel_format   - x軸標注格式化所用lambda函式
				ylabel_format   - y軸標注格式化所用lambda函式
				zlabel_format   - z軸標注格式化所用lambda函式

5.2.25 隱藏刻度網格

WxGLRegion.hide_ticks()

無引數

5.2.26 繪制2D網格和刻度

WxGLRegion.ticks2d(**kwds)

kwds        - 關鍵字引數
				segment_min     - 標注最少分段數量
				segment_max     - 標注最多分段數量
				label_2D3D      - 標注試用2D或3D文字
				label_size      - 標注字號
				xlabel_format   - x軸標注格式化所用lambda函式
				ylabel_format   - y軸標注格式化所用lambda函式

5.2.27 繪制流體

WxGLRegion.flow(ps, us, vs, ws, **kwds)

ps          - 頂點坐標集,numpy.ndarray型別,shape=(n,3)
us          - 頂點u分量集,numpy.ndarray型別,shape=(n,)
vs          - 頂點v分量集,numpy.ndarray型別,shape=(n,)
ws          - 頂點w分量集,numpy.ndarray型別,shape=(n,)
kwds        - 關鍵字引數
				color       - 軌跡線顏色,None表示使用速度映射顏色
				actor       - 頂點模型型別,'point'|'line'兩個選項
				size        - point大小
				width       - line寬度
				length      - 軌跡線長度,以速度矢量的模為單位
				duty        - 頂點line模型長度與軌跡線長度之比(占空比),建議值為0.4
				frames      - 總幀數
				interval    - 幀間隔,以ms為單位
				threshold   - 高通閾值,濾除速度小于閾值的資料點
				name        - 模型名

5.3 應用示例

代碼部分請從GitHub下載,這里只給出一個界面截圖,

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166889.html

標籤:java

上一篇:(求指導這么寫為何出錯)1.實作和不超過100位的超長整數加法。從鍵盤輸入任意兩個不超過100位的十進制超長整數(和不超過100位),輸出相加的結果

下一篇:求助c++編程,幸運數字問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more