zoukankan      html  css  js  c++  java
  • 【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)

    0 导学

    目的:掌握利用三维效果表达科学和工程数据的能力

    传播一种思想:可视化技术是数据之眼

    image

    内容组织:

        流体数据的标量可视化、矢量可视化实例

        三维扫描数据(模型/地形)可视化实例

        三维地球场景可视化实例

        曲线UI交互控制可视化实例

    1 基础运用

    科学计算可视化的主要方法:

        二维标量数据场:颜色映射法、等值线方法、立体图法和层次分割法

        三维标量数据场:面绘制方法、体绘制方法

        矢量数据场:直接法(箭头、线段、色轮等手段表示矢量数据)、流线法

    应用领域:地球科学、大气科学、医学/生命科学、生物/分子科学、航空/航天/工业、化工/化学、物理/力学、人类/考古、地址勘探等

    1.1 TVTK入门

    TVTK库是在标准VTK库之上用traits进行了封装,因此可以查看VTK库文档https://vtk.org/doc/nightly/html/annotated.html

        TVTK库中类名去除了前缀vtk

        函数名按照Python惯例,采用下划线连接单词,如AddItem->add_item

        VTK对象的方法在TVTK中用Trait属性替代,例如VTK中m.SetInputConnection(c.GetOutputPort()),TVTK中m.input_connection(c.output_port)


    安装:

    conda install vtk

    conda install numpy

    conda install traits

    conda install mayavi

    conda install PyQt

    或者从https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应用whl文件pip安装


    安装完测试下

    image

    from tvtk.tools import tvtk_doc
    tvtk_doc.main()
    
    In[3]: from tvtk.api import tvtk
    In[4]: s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
    In[5]: print(s)
    vtkCubeSource (000001A7ACDECA70)
      Debug: Off
      Modified Time: 132
      Reference Count: 2
      Registered Events: 
        Registered Observers:
          vtkObserver (000001A7B0699C20)
            Event: 33
            EventName: ModifiedEvent
            Command: 000001A7B097C560
            Priority: 0
            Tag: 1
      Executive: 000001A7B0418800
      ErrorCode: No error
      Information: 000001A7AD8034D0
      AbortExecute: Off
      Progress: 0
      Progress Text: (None)
      X Length: 1
      Y Length: 2
      Z Length: 3
      Center: (0, 0, 0)
      Output Points Precision: 0
    

    创建一个基本三维对象

    s = tvtk.CubeSource(traits)

    s表示对象变量,返回一个三维对象实例

    tvtk.CubeSource是一个构造函数,构造具有一定traits属性的长方体数据源对象

    什么是traits,英文意思的属性,由于python变量没有类型,导致实际操作中遇到了些不便利,traits库可以为python添加类型定义,由于tvtk正是在vtk上用traits库进行的封装形式,为了更简单的理解,我们可以认为traits就是tvtk对象的属性

    imageimage此外tvtk还有其他基本三维对象

    image试着建立个圆锥体数据源看看

    In[3]: from tvtk.api import tvtk
    In[4]: s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36)
    In[5]: s.height
    Out[5]: 3.0
    In[6]: s.radius
    Out[6]: 1.0
    In[7]: s.resolution
    Out[7]: 36
    In[8]: s.center
    Out[8]: array([0., 0., 0.])
    In[9]: print(s)
    vtkConeSource (000002CC5566E290)
      Debug: Off
      Modified Time: 134
      Reference Count: 2
      Registered Events: 
        Registered Observers:
          vtkObserver (000002CC572346C0)
            Event: 33
            EventName: ModifiedEvent
            Command: 000002CC573449D0
            Priority: 0
            Tag: 1
      Executive: 000002CC56FFA700
      ErrorCode: No error
      Information: 000002CC5722B540
      AbortExecute: Off
      Progress: 0
      Progress Text: (None)
      Resolution: 36
      Height: 3
      Radius: 1
      Capping: On
      Center: (0, 0, 0)
      Direction: (1, 0, 0)
      Output Points Precision: 0
    


    显示一个三维对象

    image

    from tvtk.api import tvtk
    
    # 创建一个长方体数据源,并且同时设置其长宽高
    s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0)
    # 使用PolyDataMapper将数据转换为图形数据
    m = tvtk.PolyDataMapper(input_connection=s.output_port)
    # 创建一个Actor
    a = tvtk.Actor(mapper=m)
    # 创建一个Renderer,将Actor添加进去
    r = tvtk.Renderer(background=(0, 0, 0))
    r.add_actor(a)
    # 创建一个RenderWindow(窗口),将Renderer添加进去
    w = tvtk.RenderWindow(size=(300, 300))
    w.add_renderer(r)
    # 创建一个RenderWindowInteractor(窗口的交互工具)
    i = tvtk.RenderWindowInteractor(render_window=w)
    # 开启交互
    i.initialize()
    i.start()
    

    将长方体数据转化为三维图像运用了什么技术?

        管线(Pipeline),对象之间协调完成工作的过程,需要众多的的TVTK对象共同协调完成,如tvtk.CubeSource、tvtk.PolyDataMapper、tvtk.Actor、tvtk.Renderer、tvtk.RenderWindow、tvtk.RenderWindowInteractor

    1.2 TVTK管线与数据加载

    管线基本流程

    image

    几乎所有渲染引擎都会涉及管线技术,TVTK管线分为2部分,其中:

            可视化管线:将原始数据加工为图形数据的过程

    imageimage        图形管线:图形数据加工为我们所看到的图像的过程

    imageimage

    IVTK工具观察管线

    from tvtk.api import tvtk
    from tvtk.tools import ivtk
    from pyface.api import GUI
     
    s = tvtk.CubeSource(x_length=1.0, y_length=2.0, z_length=3.0)
    m = tvtk.PolyDataMapper(input_connection=s.output_port)
    a = tvtk.Actor(mapper=m)
     
    #创建一个带Crust(Python Shell)的窗口
    gui = GUI()
    win = ivtk.IVTKWithCrustAndBrowser()
    win.open()
    win.scene.add_actor(a)
     
    #开始界面消息循环
    gui.start_event_loop()
    

    由于版本过高,from tvtk.tools import ivtk,这句出现错误。。。

    imageimage

    TVTK数据集

    数据集,包括点与数据,点之间有连接和非连接关系,多个相关的点组成单元,点的连接有隐式和显示,数据有标量和矢量

    imageTVTK五种数据集image

    ImageData表示二维或三维图像的数据结构,可以简单的理解为二维或三维数组,特点是在数组中存放数据,点位于正交且等距的网格上,我们不需要给出坐标,点之间的连接关系由它们在数组中的位置确定,点的连接关系是隐性的

    imageimage

    image



    from tvtk.api import tvtk
    img = tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
    
    print(img.get_point(0))
    
    for n in range(6):
        print("%.1f,%.1f,%.1f"% img.get_point(n))
    

    RectilinearGrid:间距不均匀的网格,所有点都在正交的网格上

    image如何构建

    from tvtk.api import tvtk
    import numpy as np
     
    x = np.array([0,3,9,15])
    y = np.array([0,1,5])
    z = np.array([0,2,3])
    r = tvtk.RectilinearGrid()
    r.x_coordinates = x
    r.y_coordinates = y
    r.z_coordinates = z
    r.dimensions = len(x),len(y),len(z)
    

    同样可以查看imageStructuredGrid:创建任意形状的网格,需要指定点的坐标

    imagePolyData:由一系列的点和点之间的联系、点构成的多边形组成

    image

    由于这些信息都要用户设置,因此用程序创建PolyData比较繁琐,TVTK很多三维模型可以输出PolyData对象

    TVTK数据加载

    大多数可视化数据并非是TVTK库中构建,而是通过接口读取外部数据文件

    TVTK库继承关系

    imageVTK三维模型读取

    imageSTL文件是在计算机图形应用系统中用于表示三角形网格的一种文件格式,这种格式非常简单,应用很广泛

    from tvtk.api import tvtk
    from tvtkfunc import ivtk_scene,event_loop
     
    s = tvtk.STLReader(file_name = "python.stl")
    m = tvtk.PolyDataMapper(input_connection = s.output_port)
    a = tvtk.Actor(mapper = m)
     
    win = ivtk_scene(a)
    win.scene.isometric_view()
    event_loop()
    

    image

    from tvtk.api import tvtk
     
    def read_data():# 读入数据
        plot3d = tvtk.MultiBlockPLOT3DReader(
                xyz_file_name="combxyz.bin",#网格文件
                q_file_name="combq.bin",#空气动力学结果文件
                scalar_function_number=100,#设置标量数据数量
                vector_function_number=200#设置矢量数据数量
                )
        plot3d.update()
        return plot3d
     
    plot3d = read_data()
    grid = plot3d.output.get_block(0)
    

    image的2




    待续

  • 相关阅读:
    Android入门第六篇之ListView (一)
    mysql触发器的作用及语法
    查询记录时rs.previous()的使用
    Microsoft Visual C++ Runtime Library Runtime Error的解决的方法
    Ubuntu中编译链接Opencv应用的简便方式
    24点经典算法
    CMS系统简介(从简介到使用)
    编程学习资源
    Django是什么
    Thinkphp中的自动验证
  • 原文地址:https://www.cnblogs.com/yongestcat/p/12023470.html
Copyright © 2011-2022 走看看