python三维转换教程_Python科学计算三维可视化【完结】
中国MOOC《Pyhton计算计算三维可视化》总结
课程url:here ,教师:黄天宇,嵩天
下文的图片和问题,答案都是从eclipse和上完课后总结的,转载请声明。
Python数据三维可视化
1Introduction
1.1可视化计算工具
1.1.1TVTK 科学计算三维可视化基础
Mayavi 三维网格面绘制,三维标量场和矢量场绘制
TraitsUI 交互式三维可视化
SciPy 拟合,线性差值,统计,插值
数据过滤器
需要安装的软件:VTK, Mayavi, numpy, PyQt4, Traits, TraitsUI
1.2内容组织
流体数据的标量可视化、矢量可视化实例
三维扫描数据(模型/地形)
三维地球场景可视化实例
曲线UI交互控制可视化
2基础运用
2.1TVTK入门
科学计算可视化主要方法
二维标量数据场:颜色映射法,等值线法,立体图/层次分割法
三维标量数据场:面绘制法,体绘制法
矢量数据场:直接法,流线法
VTK库安装方法是将文件放在下面,这样系统可以自动检测到并安装,安装在使用如下操作,在开始菜单栏,输入cmd,用管理员身份启动cmd,输入pip install xxx(VTK版本号),有时候安装不行是因为pip需要更新,或者VTK文件放的位置不对,只要根据系统提示正确操作就行。
2.2创建一个基本三维对象
tvtk.CubeSource()的使用代码为s = tvtk.CubeSource(traits)
tvtk中CubeSource()的调用方式:
s = tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
x_length:立方体在X轴的长度
y_length:立方体在Y轴的长度
z_length:立方体在Z轴的长度
以下是s的输出结果:
Debug: Off
Modified Time: 1903583
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001813DFDB520)
Event: 33
EventName: ModifiedEvent
Command: 000001813DBFDF80
Priority: 0
Tag: 1
Executive: 000001813D838460
ErrorCode: No error
Information: 000001813D864210
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.x_length/s.y_length/s.z_length获取长方体在三个方向上的长度。
CubeSource对象的方法
方法
说明
Set/get_x_length()
设置/获取长方体对象在X轴方向的长度
Set/get_y_length()
设置/获取长方体对象在Y轴方向的长度
Set/get_z_length()
设置/获取长方体对象在Z轴方向的长度
Set/get_center()
设置/获取长方体对象所在坐标系的原点
Set/get_bounds()
设置/获取长方体对象的包围盒
TVTK库的基本三维对象
三维对象
说明
CubeSource
立方体三维对象数据源
ConeSource
圆锥三维对象数据源
CylinderSource
圆柱三维对象数据源
ArcSource
圆弧三维对象数据源
ArrowSource
箭头三维对象数据源
比如建立圆锥model,输入
from tvtk.api import tvtk
s = tvtk.ConeSource(height=3.0,radius=1.0,resolution=36)
可以用s.height/s.radius/s.resolution(分辨率)查到高度,半径和分辨率的数据,如果要详细指导所有数据,可以用print(s)命令。
vtkConeSource (000001813DE1E0E0)
Debug: Off
Modified Time: 1903620
Reference Count: 2
Registered Events:
Registered Observers:
vtkObserver (000001813DFDC000)
Event: 33
EventName: ModifiedEvent
Command: 000001813DBFDD40
Priority: 0
Tag: 1
Executive: 000001813D839090
ErrorCode: No error
Information: 000001813D864120
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
2.3显示一个基本三维对象
2.3.1如何利用tvtk绘制三维图形
tvtk使用管线(pipeline)绘制三维图形,其中一下函数
CubeSource(xxx)
PolyDataMapper(xxx)
Actor(xxx)
Renderer(xxx)
RenderWindow(xxx)
RenderWindowInteracotor(xxx)
协作完成管线任务
2.3.2实现一个三维长方体代码
代码例1
from tvtk.api import tvtk
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)
r = tvtk.Renderer(background=(0,0,0))
r.add_actor(a)
w = tvtk.RenderWindow(size=(300,300))
w.add_renderer(r)
i = tvtk.RenderWindowInteractor(render_window = w)
i.initialize()
i.start()
2.4TVTK管线与数据加载
TVTK管线分两部分:数据预处理和图形可视化
数据预处理以s.output_port和m.input_connection形式输出
管线的两种类型:可视化管线(将原始数据加工成图形数据),图形管线(图形数据加工成图像)
可视化管线分两个对象:PolyData(计算输出一组长方形数据)和PolyDataMapper(通过映射器映射为图形数据)
TVTK对象
说明
Actor
场景中一个实体,描述实体位置,方向,大小的属性
Renderer
渲染作用,包括多个Actor
RenderWindow
渲染用的图形窗口,包括一个或多个Render
RenderWindowInteractor
交互功能,评议,旋转,放大缩小,不改变Actor或数据属性,只调整场景中照相机位置
管线的数据可以表示如下:
总结下TVTK管线就分为以下几个部分:数据预处理,数据映射,图形绘制,图形显示与交互
建立长方形模型:
2.4.1IVTK观察管线
代码例2
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
s= tvtk.CubeSource(x_length=1.0,y_length=2.0,z_length=3.0)
m= tvtk.Actor(mapper=m)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
True
win.scene.add_actor(a)
gui.start_event_loop()
显示结果:
有会出现bug,在主窗口缩放时左侧串口处于游离状态。
Debug程序:
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
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)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
dialog=win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
gui.start_event_loop()
Debug后第窗口界面,注意左侧的菜单栏,有分级
Model 建立后,可以在命令框输入代码,获取数据,比如:
输入print(scene.renderer.actors[0].mapper.input.points.to_array),可以得到长方体各个顶点的坐标。
如果要集成开发,可以将函数单独封装,放到python.exe目录下,比如上一个生成长方体的代码可以封装成以下两部分:
主函数
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
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)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
调用函数
defivtk_scene(actors):from tvtk.tools importivtk#创建一个带Crust(Python Shell)的窗口
win =ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(actors)#修正窗口错误
dialog =win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()returnwindefevent_loop():from pyface.api importGUI
gui=GUI()
gui.start_event_loop()
2.4.1Tvtk数据集(TVTK数据加载例1)
Tvtk中有5中数据集:
ImageData表示二维/三维图像的数据结构,有三个参数,spacing,origin,dimensions
from tvtk.api importtvtk
img= tvtk.ImageData(spacing=(1,1,1),origin=(1,2,3),dimensions=(3,4,5))
img.get_point(0)#attain the data of first point
(1.0, 2.0, 3.0)for n in range(6):
...print("%1.f,%1.f,%1.f"%img.get_point(n))
最后得到结果
1,2,3
2,2,3
3,2,3
1,3,3
2,3,3
3,3,3
RectilinearGrid 表示创建间距不均匀的网格,所有点都在正交的网格上通过如下代码构建数据集:
r.y_coordinates =y
r.z_coordinates=z
r.dimensions=len(x),len(y),len(z)
r.x_coordinates=x
r.y_coordinates=y
r.z_coordinates=z
r.dimensions=len(x),len(y),len(z)for n in range(6):
...print(r.get_point(n))
得到数据结果,在轴上数据递增:
(0.0, 0.0, 0.0)
(3.0, 0.0, 0.0)
(9.0, 0.0, 0.0)
(15.0, 0.0, 0.0)
(0.0, 1.0, 0.0)
(3.0, 1.0, 0.0)
StructuredGrid 表示创建任意形状网格,需要指定点的坐标
PolyData 表示由一系列的点、点之间的联系以及由点构成的多边形组成
UnstructuredGrid 无组织网格
TVTK数据集
特点
Imagedata
正交等间距
RectilinearGrid
正交不等间距
StructuredGrid
任意形状网格
PolyData
点和点之间的联系
UnstructuredGrid
无组织点
2.4.3Tvtk读取stl文件
STL文件调用形式:
S = tvtk.STLReader(file_name = “stl文件名”)
文件调用形式
vtkOBJReader()
ply文件调用形式
vtkPLYReader()
调用外部数据
VtkMultiBlockPLOT3DReander()
from tvtk.api importtvtkfrom tvtkfunc importivtk_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()
Stl格式数据,可以在python三维可视化中打开,也就是说solidworks中创建的stl文件也可以在python三维可视化中打开。
2.4.4Tvtk读取MultiBlock3D数据文件
3D文件读取用MultiBlock数据读取。
网格(XYZ文件),空气动力学结果(Q文件),通用结果文件
源码:但是执行失败,错误类型是tvtk没有定义,或者plot3d没有定义
1. from tvtk.api importtvtk2.3. def read_data():#读入数据
4. plot3d =tvtk.MultiBlockPLOT3DReader(5. xyz_file_name="combxyz.bin",#网格文件
6. q_file_name="combq.bin",#空气动力学结果文件
7. scalar_function_number=100,#设置标量数据数量
8. vector_function_number=200#设置矢量数据数量
9. )10. plot3d.update()11. returnplot3d12.13. plot3d =read_data()14. grid = plot3d.output.get_block(0)
3VTK可视化基础实战
介绍三类可视化方法:标量可视化,矢量可视化,轮廓化可视化
3.1可视化实例
3.1.1标量可视化
等值面:标量值相等的面
Generate_value() 设定N条等值线的值,一般用于重新绘制等值线
Set_value() 设定一条等值线的值,一般用于覆盖某条等值线或者新增加一条等值线
代码例2:绘制流体数据模型的标量场
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name="combxyz.bin",
... q_file_name="combq.bin",
... scalar_function_number=100,vector_function_number=200)
plot3d.update()
grid=plot3d.output.get_block(0)
con=tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(20,grid.point_data.scalars.range)
m= tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=con.output_port)
a= tvtk.Actor(mapper=m)
a.property.opacity=0.5win= ivtk_scene(a) #以下3行为交互代码
win.scene.isometric_view()
event_loop()
Generate_values(x,y)两个参数意义:x代表指定轮廓数,y代表数据范围
同样set_values(x,y)中也有同样的两个参数,含义相同,改变这两个参数会改变轮廓数和数据范围
3.1.2矢量可视化
Tvtk.Glyph3D() 符号化技术,可以解决矢量数据可视化问题。
Tvtk.MaskPoints() 降采样
箭头表示标量大小,箭头方向表示矢量方向。
代码例3 矢量化向量
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name= "combxyz.bin",
... q_file_name= "combq.bin",
... scalar_function_number= 100,vector_function_number = 200)
plot3d.update()
grid=plot3d.output.get_block(0)
mask= tvtk.MaskPoints(random_mode=True,on_ratio=50)
mask.set_input_data(grid)
glyph_source=tvtk.ConeSource()
glyph= tvtk.Glyph3D(input_connection=mask.output_port,scale_factor=4)
glyph.set_source_connection(glyph_source.output_port)
m= vtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=glyph.output_port)
a= tvtk.Actor(mapper =m)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
得到结果:
vtk.Glyph3D() 符号化技术
为了表示矢量数据,TVTK库中运用tvtk.Glyph3D()方法,同时运用MaskPoints()方法进行降维采样。
3.1.3空间轮廓线可视化
需要用到tvtk.StructuredGridOutlineFilter()
Python清空命令行代码函数:
Import osdefclear():
os.system(‘cls’)
clear()
代码例4
from tvtk.api importtvtkfrom tvtk.common importconfigure_inputfrom tvtkfunc importivtk_scene, event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
xyz_file_name="combxyz.bin",
q_file_name="combq.bin",
scalar_function_number=100, vector_function_number=200)#读入Plot3D数据
plot3d.update()#让plot3D计算其输出数据
grid = plot3d.output.get_block(0)#获取读入的数据集对象
outline = tvtk.StructuredGridOutlineFilter()#计算表示外边框的PolyData对象
configure_input(outline, grid)#调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(input_connection=outline.output_port)
a= tvtk.Actor(mapper=m)
a.property.color= 0.3, 0.3, 0.3
#窗口绘制
win =ivtk_scene(a)
win.scene.isometric_view()
event_loop()
显示结果
PolyData对象的外边框处理使用了什么方法?
PolyData对象外边框使用了StructuredGridOutlineFilter()的方法。
3.1.4结合矢量可视化和空间轮廓线可视化
对标量/轮廓属性进行赋值,不会处理。
from tvtk.api importtvtkfrom tvtk.common importconfigure_inputfrom tvtkfunc importivtk_scene, event_loop
plot3d=tvtk.MultiBlockPLOT3DReader(
... xyz_file_name= "combxyz.bin",
... q_file_name= "combq.bin",
... scalar_function_number= 100,vector_function_number = 200)
plot3d.update()
grid=plot3d.output.get_block(0)
con=tvtk.ContourFilter()
con.set_input_data(grid)
con.generate_values(20,grid.point_data.scalars.range) #20代表等值面
outline = tvtk.StructuredGridOutlineFilter()#计算表示外边框的PolyData对象
configure_input(outline, grid)#调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(scalar_range=grid.point_data.scalars.range,input_connection=con.output_port)
m= tvtk.PolyDataMapper(input_connection=outline.output_port)
a= tvtk.Actor(mapper=m)
a.property.color= 0.3, 0.3, 0.3a.property.opacity=0.5win= ivtk_scene(a) #以下3行为交互代码
win.scene.isometric_view()
event_loop()
3.2TVTK库实战练习
练习1:用tvtk绘制一个圆锥,圆锥的数据源对象为ConeSource(),圆锥高度为6.0,圆锥半径为2.0,背景色为红色。
代码例5
from tvtk.api importtvtkfrom tvtk.tools importivtkfrom pyface.api importGUI
s= tvtk.ConeSource(height=6.0,radius=1.0,resolution=36)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
gui=GUI()
win=ivtk.IVTKWithCrustAndBrowser()
win.open()
win.scene.add_actor(a)
dialog=win.control.centralWidget().widget(0).widget(0)from pyface.qt importQtCore
dialog.setWindowFlags(QtCore.Qt.WindowFlags(0x00000000))
dialog.show()
gui.start_event_loop()
代码例6
from tvtk.api importtvtk
s= tvtk.ConeSource(height=6.0,radius=2.0,resolution=36)
m= tvtk.PolyDataMapper(input_connection=s.output_port)
a= tvtk.Actor(mapper=m)
r= tvtk.Renderer(background=(1,0,0))
r.add_actor(a)
w= tvtk.RenderWindow(size=(300,300))
w.add_renderer(r)
i= tvtk.RenderWindowInteractor(render_window=w)
i.initialize()
i.start()
练习2:使用tvtk库读取obj,并显示出来。
from tvtk.api importtvtkfrom tvtkfunc importivtk_scene,event_loop
s= tvtk.OBJReader(file_name = 'python.obj')
m= tvtk.PolyDataMapper(input_connection =s.output_port)
a= tvtk.Actor(mapper=m)
win=ivtk_scene(a)
win.scene.isometric_view()
event_loop()
x.obj文件应该放在anaconda(python)安装目录下。
Stl和obj模型包括哪些信息?
Stl全称是stereolithograph,模型包括三角面片数,每个三角面片的几何信息(法矢,三个顶点的坐标),三角面片属性。
Obj是3D模型文件模式,模型包括顶点数据,自由形态曲线/表面属性,元素,自由形态曲线/表面主题陈述,自由形态表面之间的连接,成组,显示/渲染属性。
练习3:通过get_value()和set_value()设定第一个等值面的值为原来的2倍
3.3Mayavi库入门
类别
说明
绘图函数
Barchar, contour3d, contour_surf, flow, imshow, mesh, plot3d, points3d, quiver3d, surf, triangular, mesh
图形控制函数
Clf, close, draw, figure, fcf, savefig, screenshot, sync_camera
图形修饰函数
Colorbar, scalarbar, xlabel, ylabel, zlabel
相机控制函数
Move, pitch, roll, view, set_engine
其他函数
Animate, axes, get_engine, show, set_engine
Mlat管线控制
Open, set_tvk_src,adddataset, scalar_cut_plane
Mayavi API
类别
说明
管线基础对象
Scene, source, filter, modulemanager, module, pipelinebase, engine
主视窗和UI对象
DecoratedScene, mayaviscene, sceneeditor, mlabscenemodel, engineview, enginerichview
3.3.1快速绘图实例
代码例7
#定义10个点的三维坐标,建立简单立方体
x = [[-1,1,1,-1,-1],[-1,1,1,-1,-1]]
y= [[-1,-1,-1,-1,-1],[1,1,1,1,1]]
z= [[1,1,-1,-1,1],[1,1,-1,-1,1]]from mayavi importmlab
s= mlab.mesh(x,y,z)
代码例8
#建立复杂几何体
From numpy importpi,sin,cos,mgridfrom mayavi importmlab
dphi,dtheta= pi/250.0, pi/250.0[phi,theta]= mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta]
m0= 4; m1 =3; m2 =2; m3 = 3; m4 = 6; m5= 2; m6 = 6; m7 = 4r= sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
x= r*sin(phi)*cos(theta)
y= r*cos(phi)
z= r*sin(phi)*sin(theta)
s=mlab.mesh(x,y,z)
mlab.show()
Mesh函数是三个二维的参数,点之间的连接关系,尤其由x,y,z之间的位置关系所决定。
上面这个例子如果改变代码行为mlab.mesh(x,y,z,representation="wireframe",line_width=1.0)
则结果为
3.3.2Mayavi管线(分析mayavi如何控制画面)
Mayavi管线的层级
Engine:建立和销毁Scenes
Scenes:多个数据集合Sources
Filters:对数据进行变换
Modules Manager:控制颜色,Colors and Legends
Modules:最终数据的表示,如线条、平面等
程序配置属性的步骤:
获得场景对象,mlab.gcf()
通过children属性,在管线中找到需要修改的对象
配置窗口有多个选项卡,属性需要一级一级获得
s = mlab.gcf #获得s对象当前场景
print(s) #输出当前对象状态
print(s.scene.background) #输出当前设置的场景的背景色
source = s.children[0] #获取对象
print(repr(source)) #输出mlab儿子数组对象的第一个值地址
print(source.name) #返回该节点名称
print(repr(source.data.points)) #输出该节点坐标
print(repr(source.data.point_data.scalars))
manager= source.children[0] #数据源法向量
print(manager)#通过程序更改物体颜色和对应颜色值
colors =manager.children[0]
colors.scalar_lut_manager.show_legend=True
surface= colors.children[0] #获取颜色的第一个子节点。Surface可以设置图形的显示方式
surface.actor.property.representation =“wireframe”
surface.actor.property.opacity= 0.6 #透明度设置为0.6
mayavi与tvtk处理三维可视化的异同点:tvtk处理三维可视化要通过映射,预处理步骤,而mayavi在获取数据,可以通过mlab.mesh(x,y,z)生成三维可视化图形。
3.4Mayavi库入门
3.4.1基于numpy数组的绘图函数
Mlab对numpy建立可视化过程:
建立数据源
使用filter(可选)
添加可视化模块
3D绘图函数-Points3d()
函数形式:
Points3d(x,y,z,…) points3d(x,y,z,s,...) points3d(x,y,z,f,…)
X,y,z便是numpy数组、列表或者其他形式的点三维坐标
s表示在该坐标点处的标量值
F表示通过函数f(x,y,z)返回的标量值
代码例9
t = np.linspace(0, 4 * np.pi, 20)
x= np.sin(2 *t)
y=np.cos(t)
z= np.cos(2 *t)
s= 2 +np.sin(t)
points= mlab.points3d(x,y,z,s,colormap='Reds',scale_factor=.25)
参数
说明
Color
VTK对象的颜色,定义为(0,1)的三元组
Colormap
Colormap的类型,例如Reds、Blues、Copper等
Extent
x,y,z数组范围[xmin,xmax,ymin,ymax,zmin,zmax]
Figure
画图
Line_width
线的宽度,该值为float,默认为0.2
Mask_points
减小/降低大规模点数据集的数量
Mode
符号的模式,例如2darrow、2dcircle、arrow、cone等
Name
VTK对象名字
Opcity
VTK对象的整体透明度,改值为float型,默认为1.0
Reset_zoom
对新加入场景数据的缩放进行重置。默认为True
Resolution
符号的分辨率,如球体的细分数,该值为整型,默认为8
Scale_factor
符号放缩的比例
Scale_mode
符号的放缩模式,如vector、scalar、none
Transparent
根据标量值确定actor的透明度
Vmax
对colormap放缩的最大值
Vmin
对colormap放缩的最小值
3D绘图函数-Plot3d()
函数形式:
Plot3d(x,y,z…) plot3d(x,y,z,s,…)
X,y,z表示numpy数组,或列表。给出了线上连续的点的位置。S表示在该坐标点处的标量值
参数
说明
Tube_radius
线管的半径,用于描述线的粗细
Tube_sides
表示线的分段数,该值为整数,默认为6
X,y,z表示numpy数组,给出了线上连续的点的位置。
Np.sin(mu)表示在该坐标点处的标量值
Tube_radius绘制线的半径为0.025
Colormap采用Spectral颜色模式
代码例10
importnumpy as npfrom mayavi importmlab
n_mer, n_long= 6,11dphi= np.pi / 1000.0phi= np.arange(0.0, 2 * np.pi + 0.5 *dphi, dphi)
mu= phi *n_mer
x= np.cos(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
y= np.sin(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
z= np.sin(n_long * mu /n_mer) * 0.5l= mlab.plot3d(x,y,z,np.sin(mu),tube_radius=0.025,colormap="Spectral")
X,y,z便是numpy数组,给出了线上连续的点的位置。
Np.sin(mu)表示在该坐标点处的标量值
Tube_radius绘制线的半径为0.025
Colormap采用Spectral颜色模式
3D绘图函数-2D数据
Imshow()-3D绘图函数
Interpolate 图像中的像素是否被插值,该值为布尔型,默认为True
代码例11
importnumpyfrom mayavi importmlab
s= numpy.random.random((10,10))
img= mlab.imshow(s,colormap='gist_earth')
mlb.show()
3D绘图函数 - surf()
函数形式:
Surf(s,...)
Surf(x,y,s…)
Surf(x,y,f,..)
S是一个高程矩阵,用二维数组表示
代码例12
importnumpy as npfrommayavi improt mlabfrom mayavi importmlabdeff(x,y):return np.sin(x - y) + np.cos(x +y)
x, y= np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05]
s=mlab.surf(x,y,f)
mlab.show()
3D绘制函数 - contour_surf(),与surf()类似求解曲面,contour_surf求解等值线
代码例13
importnumpy as npfrom mayavi importmlabdeff(x,y):return np.sin(x - y) + np.cos(x +y)
x,y= np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05]
con_s= mlab.contour_surf(x,y,f)
3D绘图函数 - contour3d()
函数形式:
Contour3D(scalars…)
Contour3d(x,y,z,scalar,..)
Scalars 网络上的数据,用三维numpy数组shuming,x,y,z代表三维空间坐标
参数
说明
Contours
定义等值面的数量
代码例14
importnumpyfrom mayavi importmlab
x,y,z= numpy.ogrid[-5:5:64j,-5:5:64j,-5:5:64j]
scalars= x * x + y * y + z *z
obj= mlab.contour3d(scalars, contours=8,transparent=True)
3D绘图函数 – quiver3d()
函数形式:
quiver3d(u,v,w…)
quiver3d(x,y,z,u,v,w…)
quiver3d(x,y,z,f,…)
u,v,w用numpy数组表示的向量
x,y,z表示箭头的位置,u,v,w矢量元素
f需要返回咋给定位置(x,y,z)的(u,v,w)矢量
代码例15
r = np.sqrt(x ** 2 + y ** 2 + z ** 4)
u= y * np.sin(r) / (r + 0.001)
v= -x * np.sin(r)/ (r + 0.001)
w=np.zeros_like(z)
obj= mlab.quiver3d(x,y,z,u,v,w,line_width=3,scale_factor=1)
Questions:
points3D和Plot3D两个函数之间的区别于联系是什么?
Imshow()方法是如何确定二维数组可视化图像颜色的?
Surf()方法实例中通过什么方法获取x,y二维数组的?
Mlab中可以进行矢量数据可视化的方法有哪些?
Corresponding answers:
Points3D是基于Numpy数组x,y,z提供的数据点坐标,绘制图形;Plot3D是基于1维numpy数组x,y,z供的三维坐标数据绘制图形;
Imshow()通过colormap关键字确定颜色,比如colormap='gist_earth',确定颜色为“类似地球表面颜色”;
Surf()方法是通过np.mgrid(xxx,xxx)获取x,y二维数组;
mlab.Flow()和mlab.quiver3d()
3.4.2改变物体的外观
改变颜色
代码例16
Colormap定义的颜色,也叫LUT即look up table.
importnumpy as npfrom mayavi importmlab
x,y= np.mgrid[-10:10:200j,-10:10:200j]
z= 100 * np.sin(x * y) / (x *y)
mlab.figure(bgcolor=(1,1,1))surf= mlab.surf(z,colormap='cool')
mlab.show()
代码例17
当代码例16增加以下代码到代码例17时,图像的颜色变淡,透明度增加。
importnumpy as npfrom mayavi importmlab#建立数据
x,y = np.mgrid[-10:10:200j,-10:10:200j]
z= 100 * np.sin(x * y) / (x *y)#对数据进行可视化
mlab.figure(bgcolor=(1,1,1))surf= mlab.surf(z,colormap='cool')
mlab.show()#访问surf对象的LUT#LUT是一个255x4的数组,列向量表示RGBA,每个值的范围从0-255
lut =surf.module_manager.scalar_lut_manager.lut.table.to_array()#增加透明度,修改alpha通道
lut[:,-1] = np.linspace(0,255,256)
surf.module_manager.scalar_lut_manager.lut.table=lut#更新视图,并显示图像
mlab.show()
3.4.3Mlab控制函数
图像控制函数:
函数图像
说明
Clf
清空当前图像mlab.clf(figure=None)
close
关闭图形窗口 mlab.close(scene=None, all=False)
Draw
重新绘制当前图像mlab.close(figure=None)
Figure
建立一个新的scene或者访问一个存在的scene
mlab.figure(figure=None,bgcolor=None,fgcolor=None,engine=None,size=(400,350))
Gcf
返回当前图像的handle mlab.gcf(figure=None)
Savefig
存储当前的前景,输出为一个文件,如png,jpg,bmp,tiff,pdf,obj,vrml等
图像装饰函数
函数图像
说明
Cololorbar
为对象的颜色映射增加颜色条
Scalarbar
为对象的标量颜色映射增加颜色条
Vectorbar
为对象的矢量颜色映射增加颜色条
xlabel
建立坐标轴,并添加x轴的标签mlab.xlabel(text,object=None)
Ylabel
建立坐标轴,并添加y轴的标签
zlabel
建立坐标轴,并添加z轴的标签
相机控制函数
函数图像
说明
Move
移动相机和焦点
Mlab.move(forward=None,right=None,up=None)
Pitch
沿着“向右”轴旋转角度mlab.pitch(degrees)
View
设置/获取当前视图中相机的视点
Mlab.view(azimuth=None,elevation=None,distance=None,focalpoint=None,roll=None
Reset_roll=True,figure=None
Yaw
沿着“向上”轴旋转一定角度,mlab.yaw(degrees)
其他控制函数
函数图像
说明
animate
动画控制函数mlab.animate(func=None,delay=500,ui=True)
Axes
为当前物体设置坐标轴mlab.axes(*args,**kwargs)
Outline
为当前物体建立外轮廓mlab.outline(*args,**kwargs)
Show
与当前图像开始交互mlab.show(func=None,stop=False)
Show_pipeline
显示mayavi的管线对话框,可以进行场景属性的设置和编辑
Text
为图像添加文本mlab.text(*args,**kwargs)
Title
为绘制图像建立标题mlab.title(*args,**kwargs)
3.4.4鼠标选取交互操作
On_mouse_pick(callback,type=”point”,Button=”left”,Remove=False)提供鼠标响应操作
Type:”point”,”cell” or “world”
Button:”Left”,”Middle” or “Right”
Remove:如果值为True,则callback函数不起作用
返回:一个vtk picker对象
代码例18
程序框架:
#场景初始化
figure =mlab.gcf()#用mlab.points3d建立红色和白色小球的集合#… …#处理选取事件
defpicker_callback(picker)#建立响应机制
Picker =figure.on_mouse_pick(picker_callback)
mlab.show()importnumpy as npfrom mayavi importmlab
figure=mlab.gcf()
x1, y1, z1= np.random.random((3, 10))
red_glyphs= mlab.points3d(x1, y1, z1, color=(1, 0, 0),
resolution=10)
x2, y2, z2= np.random.random((3, 10))
white_glyphs= mlab.points3d(x2, y2, z2, color=(0.9, 0.9, 0.9),
resolution=10)
outline= mlab.outline(line_width=3)
outline.outline_mode= 'cornered'outline.bounds= (x1[0] - 0.1, x1[0] + 0.1,
y1[0]- 0.1, y1[0] + 0.1,
z1[0]- 0.1, z1[0] + 0.1)
glyph_points=red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()defpicker_callback(picker):if picker.actor inred_glyphs.actor.actors:
point_id= int(picker.point_id /glyph_points.shape[0])if point_id != -1:
x, y, z=x1[point_id], y1[point_id], z1[point_id]
outline.bounds= (x - 0.1, x + 0.1,
y- 0.1, y + 0.1,
z- 0.1, z + 0.1)
picker=figure.on_mouse_pick(picker_callback)
mlab.title('Click on red balls')
mlab.show()
简述选取红色小球问题分析实例程序的基本框架和搭建流程。
1.绘制初始状态选取框时,为什么数组下标为0?
2.实例中是如何计算被获取的红色小球的位置坐标的?
3.实例程序优化中是如何解决小球初始化速度太慢的问题的
Answers:
基本框架:初始化场景-建立小球模型-处理响应事件(建立立方体套框模型)-建立响应机制(把框套到球上)
1. 绘制初始状态选取框时,希望放在第一个球上
2. 同过一下代码:
glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()
3. Before drawing the object add the code of figure.scene.disable_render = True,and after drawing the object add the code of figure.scene.disable_render = False
In the phase of creating response mechanism, add the code of Picker.tolerance = 0.01 after picker = xxx
3.4.5Mlab控制函数(23 module函数)
Mlab管线控制函数的调用
Sources: 数据源
Filters: 用来数据变换
Modules: 用来实现可视化
mlab.pipeline.function()
Sources
Grid_source
建立而为网络数据
Line_source
建立线数据
Open
打开一个数据文件
scalar_field
建立标量场数据
Vector_field
建立矢量场数据
Volume_field
建立提数据
Filters
Filters
说明
Contour
对输入数据集计算等值面
Cut_plane
对数据进行切面计算,可以交互的更改和移动切面
delaunay2D
执行二维delaunay三角化
Delaunay3D
执行三维delaunay三角化
Extract_grid
允许用户选择structured grid的一部分数据
Extract_vector_norm
计算数据矢量的法向量,特别用于计算矢量数据的梯度时
Mask_points
对输入数据进行采样
Threshold
去一定阈值范围内的数据
Transform_data
对输入数据执行线性变换
Tube
将线转成管线
Modules
Axes
绘制坐轴
Glyph
对输入点绘制不同类型的符号,符号的颜色和方向有该点的标量和向量数据决定
Glyph
对输入点绘制不同类型的符号,符号的类型和方向由该点的标量和矢量数据决定
iso_surface
对输入数据绘制等值面
Outline
对输入数据绘制外轮廓
Scalar_cut_plane
对输入的标量数据绘制特定位置的切平面
Streamline
对输入矢量数据绘制流线
Surface
对数据(KTV dataset, mayavi sources)建立外表面
Text
绘制一段文本
Vector_cut_plane
对输入的矢量数据绘制特定位置的切平面
Volume
表示对标量场数据进行体绘制
Question: 如果需要对静电场中的等势面进行可视化,需要使用什么控制函数对输入数据进行计算?
Answer: Modules.streamline()
3.4.6标量数据可视化
生成标量数据
importnumpy as np
x,y,z= np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
s= np.sin(x*y*z)/(x*y*z)from mayavi importmlab
mlab.contour3d(s)
切平面
mlab.pipeline.scalar_field(s) #设定标量数据场
plane_orientation = “x_axes” #设定切平面的方向
index.slice(10) #每10个点用1个点显示
from mayavi importmlabfrom mayavi.tools importpipeline
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
plane_orientation= "x_axes",
slice_index= 10)
mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s),
plane_orientation="y_axes",
slice_index= 10,
)
mlab.outline()
对物体设置透明度,再做切割
from mayavi importmlabfrom mayavi.tools importpipeline
src=mlab.pipeline.scalar_field(s)
mlab.pipeline.iso_surface(src,contours=[s.min()+0.1*s.ptp(),],opacity=0.1)
mlab.pipeline.iso_surface(src,contours=[s.max()-0.1*s.ptp(),])
mlab.pipeline.image_plane_widget(src,
plane_orientation="z_axes",
slice_index=10,
)
mlab.show()
Disagreemet:
Question:
1.1.Mlab中什么控制函数进行切平面绘制?有什么特点?
2.2.实例中,可视化使用了什么方法绘制特定平面的特平面?
Answers:
1.1.使用mlab.pipeline.image_plane_widget对切平面绘制,特点是切平面可以任意移动和旋转
2.2.使用mlab.pipeline.scalar_cut_plane绘制特定平面的切平面
3.4.7矢量数据可视化
importnumpy as np#构建3维坐标
x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]#定义三维点分布函数
u = np.sin(np.pi*x) * np.cos(np.pi*z)
v= -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w= np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)#显示函数
from mayavi importmlab
mlab.quiver3d(u,v,w)#框架
mlab.outline()
mlab.show()
降采样
由于函数立方体分布过于密集,用Masking Vector采样中的mlab.pipeline.vectors(x,x,x)进行降采样
importnumpy as npfrom mayavi.filters importmask_points
x,y,z= np.mgrid[0:1:20j,0:1:20j,0:1:20j]
u= np.sin(np.pi*x) * np.cos(np.pi*z)
v= -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w= np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)from mayavi importmlab#mlab.quiver3d(u,v,w)#mlab.outline()#mlab.show()
src=mlab.pipeline.vector_field(u,v,w)
mlab.pipeline.vectors(src, mask_points=10, scale_factor=2.0) #放缩比例为2.0
mlab.show()
采用切面的方式:mlab.pipeline.vector_cut_plane(u,v,w)
级数的等值面
importnumpy as npfrom mayavi.filters importmask_points
x,y,z= np.mgrid[0:1:20j,0:1:20j,0:1:20j]
u= np.sin(np.pi*x) * np.cos(np.pi*z)
v= -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w= np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)from mayavi importmlab
src=mlab.pipeline.vector_field(u,v,w)#mlab.pipeline.vector_cut_plane(src, mask_points=10, scale_factor=2.0)
magnitude =mlab.pipeline.extract_vector_norm(src)
mlab.pipeline.iso_surface(magnitude, contours=[2.0,0.5])
mlab.outline()
mlab.show()
流线可视化
importnumpy as npfrom mayavi.filters importmask_points
x,y,z= np.mgrid[0:1:20j,0:1:20j,0:1:20j]
u= np.sin(np.pi*x) * np.cos(np.pi*z)
v= -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w= np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)from mayavi importmlab#mlab.quiver3d(u,v,w)#mlab.outline()#mlab.show()
src=mlab.pipeline.vector_field(u,v,w)#mlab.pipeline.vector_cut_plane(src, mask_points=10, scale_factor=2.0)
flow = mlab.flow(u,v,w,seed_scale=1,
seed_resolution=5,
integration_direction="both")
mlab.outline()
mlab.show()
矢量场复合观测
importnumpy as npfrom mayavi.filters importmask_pointsfrom matplotlib.scale importscale_factory
x,y,z= np.mgrid[0:1:20j,0:1:20j,0:1:20j]
u= np.sin(np.pi*x) * np.cos(np.pi*z)
v= -2*np.sin(np.pi*y) * np.cos(2*np.pi*z)
w= np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z)from mayavi importmlab#mlab.quiver3d(u,v,w)#mlab.outline()#mlab.show()
src =mlab.pipeline.vector_field(u,v,w)
magnitude=mlab.pipeline.extract_vector_norm(src)
iso= mlab.pipeline.iso_surface(magnitude,contours=[2.0,],opacity=0.3)
vec= mlab.pipeline.vectors(magnitude,mask_points=40,
line_width=1,
color=(0.8,0.8,0.8),
scale_factor=4.)#mlab.pipeline.vector_cut_plane(src, mask_points=10, scale_factor=2.0)
flow =mlab.pipeline.streamline(
magnitude,
seedtype="plane",
seed_visible=False,
seed_scale=0.5,
seed_resolution=1,
linetype="ribbon")
vcp=mlab.pipeline.vector_cut_plane(magnitude,
mask_points=2,
scale_factor=4,
colormap="jet",
plane_orientation="x_axes")
mlab.outline()
mlab.show()
Ques:
1.标量数据和矢量数据分别使用什么方法进行绘制?
2.2.矢量数据可视化实例中是如何对数据进行降采样的?
Answer:
1.1.mlab.contour3d(x,y,z) and mlab.quiver3d(x,y,z)进行绘制
2.2.Masking vector采样中的mlab.pipeline.vectors(src,mask_points=10,scale_factor=2.0)
4Mayavi三维可视化
4.1绘制数据dragon
程序框架:
打开文件
使用modules绘制数据的surface
显示可交互的结果
渲染dragon ply文件:
from mayavi importmlabimport shutill #shutil可以中间删除显现的文件
mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file))
mlab.show()
代码例19
#coding=gbk
from os.path importjoinfrom mayavi importmlabimporttarfile#读取压缩文件内容
dragon_tar_file = tarfile.open("dragon.tar.gz")try:
os.mkdir("dragon_data")except:pass
#将所有读取到的数据放入同一个文件夹中
dragon_tar_file.extractall("dragon_data")
dragon_tar_file.close()#加入数据到dragon_ply_file中
dragon_ply_file = join("dragon_data","dragon_recon","dragon_vri.ply")#渲染dragon.ply文件
mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file))
mlab.show()#删除中间过程文件夹
importshutil
shutil.rmtree("dragon_data")
View Code
4.2绘制数据canyon
代码例20
#1_import packages
importzipfileimportnumpy as npfrom mayavi importmlab#from pygame.examples.textinput import BGCOLOR#from mayavi.tools.filters import warp_scalar
#2_hgt(Height File Format)
hgt = zipfile.ZipFile("N36W113.hgt.zip").read("N36W113.hgt")#to certify a data type of integer,2X8=16 bit data
data = np.fromstring(hgt,">i2")#to certify the type of data
data.shape = (3601,3601)#to transform the type of data to 32bit
data =data.astype(np.float32)#to increase the efficiency of showing, only choose sort of data
data = data[500:1000,500:1000]#if there is any clearance in the source of data, set those to the minimum
data[data == -32768] = data[data >0].min()#3_use mlab.figure() to refresh the shape of the data and surf() to figure out the surface of the data#the size of window with (400,320), background, color of shining upon, enlargement and contraction scale,
mlab.figure(size = (400,320),bgcolor=(0.16,0.28,0.46))
mlab.surf(data, colormap="gist_earth",warp_scale=0.2,vmin=1200,vmax=1610)#4_clear the RAM for decomposition
deldata#5_create a window of Visualization, angle of position, height, distance
mlab.view(-5.9,83,570,[5.3,20,238])
mlab.show()
View Code
4.3绘制数据canyon
二维坐标如何转换成三维坐标?
x = R*cos(lat)*cos(lng);
y= R*cos(lat)*sin(lng);
z= R*sin(lat);
如果R= 1, 则
x= cos(lat)*cos(lng);
y= cos(lat)*sin(lng);
z=sin(lat);
lng表示经度,lat表示维度
代码例21
#get data of several cities and get their longitude as well as latitude)
from clyent importcolor
cities_data= """Bei Jing, 116.23,39.54
Shang Hai, 121.52, 30.91
Hong Kong,114.19,22.38
Delhi,77.21,28.67
Johannesburg,28.04,-26.19
Doha,51.53,25.29
Sao Paulo,-46.63,-23.53
Toronto,-79.38,43.65
New York,-73.94,40.67
San Francisco,-122.45,37.77
Dubai,55.33,25.27
Sydney,151.21,-33.87"""
#part2_create a list consisting of cities' indexes about their longtitudes and latitudes
importcsv#create a dict and a list
cities =dict()
coords=list()#print(cities,coords)
#read data
for line in list(csv.reader(cities_data.split("\n")))[1:-1]:
name, long_, lat=line
cities[name]=len(coords)
coords.append((float(long_),float(lat)))#data transformation
importnumpy as np#from [1 line n row] to [n line, 1 list]
coords =np.array(coords)#transform the angle to the arc
lat, long = coords.T * np.pi / 180
#transform 2D data to 3D data#lat = ori_long#long = ori_lat
x = np.cos(long) *np.cos(lat)
y= np.cos(long) *np.sin(lat)
z=np.sin(long)#create a window
from mayavi importmlab
mlab.figure(bgcolor=(0.48,0.48,0.48), size=(400,400))#to define a sphere#set the opacity of the surface of earth to 0.7
sphere = mlab.points3d(0, 0, 0, scale_factor=2,
color= (0.67, 0.77, 0.93),
resolution= 50,
opacity= 0.7,
name= "Earth")#to adjust the parameter of mirror reflection
sphere.actor.property.specular = 0.45sphere.actor.property.specular_power= 5
#delete the opposite side to better show the effect of opacity
sphere.actor.property.backface_culling =True#use points to describe sites of cities
points =mlab.points3d(x, y, z,
scale_mode= "none",
scale_factor= 0.03,
color= (0, 0, 1))#create names of cities#for cities.items output the names of cities and the series of cities
for city, index incities.items():#x,y,z mean x,y,z coordinates; color means text's color; width means text's width; name means text's object
label =mlab.text(x[index], y[index], city,
z=z[index], color=(0,0,1),
width=0.016 * len(city), name=city)#create continents
from mayavi.sources.builtin_surface importBuiltinSurface
continents_src= BuiltinSurface(source="earth", name="Continents")#set the LDD to 2
continents_src.data_source.on_ratio = 2continents= mlab.pipeline.surface(continents_src, color=(0,0,0))#create the equitor#distribute every 360 to 100
theta = np.linspace(0, 2 * np.pi, 50)
x=np.cos(theta)
y=np.sin(theta)
z=np.zeros_like(theta)
mlab.plot3d(x,y,z,color=(1,1,1),opacity=0.2,tube_radius=None)#show the window for interation
mlab.view(100,60,4,[-0.05,0,0])
mlab.show()
View Code
5Mayavi三维可视化
5.1三维可视之基础应用homework1
pass见下文url
5.2三维可视之基础应用homework2
pass见下文url
5.3三维可视之基础应用homework3
pass见下文url
5.4三维可视之基础应用homework4
pass见下文url
5.5三维可视之进阶实战homework5
构造一个旋转抛物面,并使用mlab.mesh绘制出来。首先在(r, theta)中创建一个20*20的二维网格:
r, theta = mgrid[0:1:10j, 0:2*pi:10j]
并将圆柱坐标系,转换为直角坐标系,其中:
z = r*r
x= r*cos(theta)
y= r*sin(theta)
(数学函数等值可从numpy中导出。)
代码例22
from mayavi importmlabimportnumpy as np
pi=np.pi
cos=np.cos
sin=np.sin
mgrid=np.mgrid
r,theta= pi/250,pi/250[r,theta]= np.mgrid[0:1:10j,0:2*pi:10j]
x= r *cos(theta)
y= r *sin(theta)
z= r *r
s=mlab.mesh(x,y,z)
mlab.show()
5.6三维可视之进阶实战homework6
对“编程练习8.1”中旋转抛物面方程进一步绘制,计算一个二维数组 s,并且把它传递给mesh()的scalars 参数。观察一下绘制结果的变化。其中 s = x*y*z. 同时,请绘制该旋转抛物面的轮廓线。
空间轮廓线可视化代码:
#coding=gbk
from mayavi importmlabimportnumpy as npfrom tvtk.api importtvtkfrom tvtk.common importconfigure_inputfrom tvtkfunc importivtk_scene, event_loop
pi=np.pi
cos=np.cos
sin=np.sin
mgrid=np.mgrid
r,theta= pi/250,pi/250[r,theta]= np.mgrid[0:1:10j,0:2*pi:10j]
x= r *cos(theta)
y= r *sin(theta)
z= r *r
s= x * y *z
s=scalars
s=mlab.mesh(scalars,x,y,z)
plot3d=tvtk.MultiBlockPLOT3DReader(
xyz_file_name="s",
q_file_name="s",
scalar_function_number=100, vector_function_number=200)#读入Plot3D数据
plot3d.update()#让plot3D计算其输出数据
grid = plot3d.output.get_block(0)#获取读入的数据集对象
outline = tvtk.StructuredGridOutlineFilter()#计算表示外边框的PolyData对象
configure_input(outline, grid)#调用tvtk.common.configure_input()
m = tvtk.PolyDataMapper(input_connection=outline.output_port)
a= tvtk.Actor(mapper=m)
a.property.color= 0.3, 0.3, 0.3
#窗口绘制
win =ivtk_scene(a)
win.scene.isometric_view()
event_loop()
mlab.show()
View Code
5.7三维可视之进阶实战homework7
可视化模型数据文件(附件),能发现了什么?
能发现一只白色雕塑的兔子
对于tar.gz类型压缩包的处理,可以参考dragon模型,可以参考以下代码:
#coding=gbk
from mayavi importmlabfrom os.path importjoinimporttarfile
dragon_tar_file= tarfile.open("dragon.tar.gz")try:
os.mkdir("dragon_data")except:passdragon_tar_file.extractall("dragon_data")
dragon_tar_file.close()
dragon_ply_file= join("dragon_data","dragon_recon","dragon_vrip.ply")#渲染dragon ply文件
mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file))
mlab.show()importshutil
shutil.rmtree("dragon_data")
View Code
大致逻辑如下:
选中并打开bunny.tar.gz---新建文件夹bunny_data---解压bunny.tar.gz到bunny_data文件夹---关闭bunny.tar.gz---串联路径从bun.zipper.ply(一般ply文件是最终目录下的扫描文件)到上一级再到上一级到最终建立的文件夹bunny_data---打开上面构建好的路径下的ply文件,用mlab.pipeline.surface()构建表面---用shutil.rmtree删除用于放置压缩文件的文件夹。
代码:
#3D scanning files
from mayavi importmlabfrom os.path importjoinimporttarfile
bunny_tar_file= tarfile.open("bunny.tar.gz")try:
os.mkdir("bunny_data")except:passbunny_tar_file.extractall("bunny_data")
bunny_tar_file.close()#combine the path of bun_vrip and its packages' name, such as dragon_data/dragon_recon/dragon_vrip.ply
bunny_ply_file = join("bunny_data","bunny","reconstruction","bun_zipper.ply")
mlab.pipeline.surface(mlab.pipeline.open(bunny_ply_file))
mlab.show()importshutil
shutil.rmtree("bunny_data")
View Code
补充:mlab绘图函数的x、y、z、s、w、u、v到底是什么含义?假设这些参数描述了一个磁场,它们可能分别代表什么含义?加入这些参数描述了一个流体,它们可能分别代表什么含义?
X,y,z表示点三维坐标;
S表示该坐标点处的标量值;
U,v,w表示矢量元素
如果应用到磁场中,x,y,z表示磁场位置,s表示该位置处磁场大小,u,v,w表示该处磁场方向。
如果应用到流体,x,y,z表示流体位置,s表示该处流量大小,u,v,w表示该处流量方向。
LOD:level of details
5.8三维可视之进阶实战homework8
1.为mayavi可视化提供数据的mayavi管线层级是Filters,这句话对吗?为什么?
不对,因为为mayavi可视化提供数据的是scence场景,scence每个场景下有多个数据集合sources,为mayavi可视化提供数据,Filter是应用于source上对数据进行变换。
2.基于1维Numpy数组x、y、z提供的三维坐标数据,绘制线图形的函数是Point3D()。这句话正确吗?为什么?
不对,因为基于1维Numpy数组x,y,z提供的三维坐标数据,绘制线图形的函数是plot3D(), point3d()是基于数组x,y,z提供的三维点坐标,绘制点图形。
3.mayavi管线中处于最顶层表示场景的对象是什么?获取当前场景的方法是什么?
Mayavi中处于最顶层的对象是mayavi Engine,表示建立和销毁场景Scene。
获取当前场景的方法是s.scene.background()
4.3D绘图函数Point3D()中,根据标量值确定actor透明度的参数是opcity。这句话正确吗?为什么?
不对,根据标量值确定actor透明度的参数是transparent,opcity用于VTK对象的整体透明度,该值为float型,默认为1.0
5.3D绘图函数中,绘制由三个二维数组x、y、z描述坐标点的网格平面的方法是imshow()。这句话正确吗?为什么?
不对,imshow()是用于绘制二维数组的,但是没有z轴,只有x和y两个轴,x作为第一轴的下标,y轴作为第二轴的下标
比如:s = numpy.random.random((10,10)),img = mlab.imshow(s,colormap='gist_earth')
6.3D绘图函数中,三维矢量数据的可视化的方法是contour3d()。这句话正确吗?为什么?
Contour3d是用来绘制标量数据3d视图的,三维矢量数据可视化的方法是mlab.quiver3d()。
7.在鼠标选取操作中,on_mouse_pick()方法返回值是什么?
On_mouse_pick()返回一个vtk对象。
8.mlab管线中,用来进行数据变换的层级是什么?用来实现数据可视化的层级是什么?
用filter对数据进行交换,用modules来对最终的数据进行可视化。
9.在mlab管线的modules层级中,用来对VTK dataset和mayavi sources建立外表面的方法是surface()。这句话正确吗?为什么?
正确,但是要却别与iso_surface(),iso_surface()是用于对输入的体数据绘制其等值面。
10.在mayavi可视化实例三中,绘制大洲边界时大洲边界粗糙的解决办法是什么?
调整LOD,比如调整continents_src.data_source.on_ratio = 2
6三维可视化之交互界面
6.1三维可视之进阶实战homework8
• Traits背景:
Python动编程态语言,变量没有类型,比如:颜色属性
“Red”字符创
0xff0000整数
(255,0,0)元组
• Traits库可以为python添加类型定义
• Traits属于解决color类型的问题
o接受能表示颜色的各种类型值
o赋值为非法的颜色值时,能够捕捉到错误,并给提供错误报告。
o提供一个内部的标注你颜色
• c.color可以支持颜色命令,如c.color = “red”,但不支持c.color = “abc”的字符串
• c.configure_traits()可以设置颜色,c.color.getRgb()可以获取设置颜色后的三原色的值
比如设置c.configure_traits()为红色,即在桌面弹出的窗口中设置Red,那么回击c.color.getRgb可以得到(255,0,0,255)这样的feedback。
6.2attributes of traits
traits的五个功能:initialization, verification, procuration, monitoring, visualization
代码23 traits
from traits.api importDelegate, HasTraits, Instance, Int, StrclassParent(HasTraits):#初始化
last_name = Str('Zhang')classChild(HasTraits):
age=Int#验证
father =Instance(Parent)#代理
last_name = Delegate('father')#监听
def_age_changed(self, old, new):print('Age change from %s to %s' % (old, new))
练习过程如下:
>>> P =Parent()>>> c =Child()>>> c.father =P>>>c.last_name'Zhang'
>>>P.last_name'Zhang'
>>> c.age = 4Age changedfrom 0 to 4
>>>
>>>c.configure_traits()
Age changedfrom 4 to 3Age changedfrom 3 to 4True>>>c.print_traits()
age:4father:<__main__.parent object at>last_name:'Zhang'
>>>c.get()
{'age': 4, 'father': <__main__.parent object at>, 'last_name': 'Zhang'}>>> c.set(age = 8)
Age changedfrom 4 to 8
View Code
在traits属性功能的实例中,能否直接修改Child的last_name属性?
不能,因为Child对象的last_name是直接继承自Parent类的,要通过父类改变
如果定义P = Parent(), c = Child();
直接输出c.last_name 没有结果
所以输出c.father = P, 再输入c.last_name就有子类名字
或者也可以直接输入P.last_name也可以得到子类名字
6.3traits属性监听
Trait属性监听:静态监听,动态监听
Trait监听属性顺序:name, age, doing---静态监听函数---动态监听1---动态监听2
静态监听函数的几种形式:属性名+changed+发生变化前的名+发生变化后的名字
_age_changed(self)
_age_changed(self,new)
_age_changed(self, old, new)
_age_changed(self, name, old, new)
动态监听:
@on_trait_change(names)
Def any_method_name(self, ..)
问:为什么对Infoupdated任意赋值都会触发监听事件?
因为Infoupdated直接由Event赋值,无论如何都会调用_Infoupdated_fired()函数,所以会触发self.reprint()函数输出self.name和self.age内容。
6.5Traits_property
用traits_property.py遍好程序后,得到area被监听的结果;如果命令行输入w/h发生变化,print输出的就是变化后的值。
调用r.edit_traits()直接触发_get_area()函数,同时在界面中显示area结果。
6.6TraitsUI
Tkinter, wxPython, pyQt4, TraitsUI(based on MVC:Model-View-Controller)
MVC是traitsUI所使用的架构模型
6.6.1Traits_UI交互
from traits.api importHasTraits, Str, IntclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Int
model=ModelManager()
model.configure_traits()
6.6.2View定义界面
TraitsUI自定义界面支持的后台库界面有:qt4(-toolkit qt4)和wx(-toolkit wx)
MVC类别
MVC说明
Model
HasTraits的派生类用Trait保存数据,相当于模型
View
没有指定界面显示方式时,Traits自动建立默认界面
Controller
起到视图和模型之间的组织作用,控制程序的流程
•Item对象属性
Item(id,name,label)
属性
说明
id
Item的唯一ID
name
Trait属性的名称
Label
静态文本,用于显示编辑器的标签
Tooltip
编辑器的提示文本
•View对象属性
属性
说明
Title
窗口标题栏
Width
窗口高度
Height
串口高度
Resizable
串口大小可变,默认为True
代码和界面如下:
问:如果想要编辑器窗口大小不能改变,应如何修改view中的哪个属性?
答:修改title中的resizable = False可以是标签大小不可变
6.6.3Group组织对象
Group对象
from traitsui.api import Group
Group(…)属性有:
属性
说明
Orientation
编辑器的排列方向
Layout
布局方式normal,flow,split,tabbed
Show_labels
是否显示编辑器的标签
Columns
布局的列数,范围为(1,50)
·Group类继承的HSplit类
Hsplit定义:
Class HSplit(Group):#...
#...
Layout =“split”
Orientation= “horizontal”
代码等价于:
Group(…, layout = “split”, orientation = “horizontal”)
•Group的各种派生类
属性
说明
HGroup
内容水平排列
Group(orientation = “horizontal”)
HFlow
内容水平排列,超过水平宽度,自动换行,隐藏标签文字。Group(orientation = “horizontal”, layout=”flow”, show_labels = False)
HSplit
内容水平分隔,中间插入分隔条
Tabbed
内容分标签页显示
Group(orientation=”horizontal”,layout=”tabber”)
Vgroup
内容垂直排列
Group(orientation=”vertical”)
Vflow
内容垂直排列,超过垂直高度时,自动换列,隐藏标签文字Group(orientation=”vertical”,layout=”flow”,show_labels=False)
Vfold
内容垂直排列,可折叠
Group(orientation=”vertical”,layout=”fold”,show_labels=False)
Vgrid
按照多列网格进行垂直排列,columns属性决定网格的列数
Group(orientation=”vertical”,columns=2)
Vsplit
内容垂直排列,中间插入分隔条
Gorup(orientation=”vertical”,layout=”split”)
代码24 多视图界面代码
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item,Groupfrom traitsui.menu importModalButtonsclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Str
vertices=Int
view1=View(
Group(
Item("model_name",label=u"模型名称"),
Item("model_name",label=u"文件名"),
Item("category",label=u"模型类型"),
label= u"模型信息",
show_border=True),
Group(
Item("model_number",label=u"模型数量"),
Item("vertices",label=u"顶点数量"),
label= u"统计数据",
show_border=True),
kind= "modal",
buttons=ModalButtons
)
model=ModelManager()
model.configure_traits(view=view1)
View Code
•垂直排列多视图
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item, Groupfrom traitsui.menu importModalButtonsclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Int
vertices=Int
view1=View(
Group(
Group(
Item('model_name', label=u"模型名称"),
Item('model_file', label=u"文件名"),
Item('category', label=u"模型类型"),
label= u'模型信息',
show_border=True),
Group(
Item('model_number',label=u"模型数量"),
Item('vertices',label=u"顶点数量"),
label= u'统计数据',
show_border=True)
)
)
model=ModelManager()
model.configure_traits(view=view1)
View Code
•水平排列多视图
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item, Groupfrom traitsui.menu importModalButtonsclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Int
vertices=Int
view1=View(
Group(
Group(
Item('model_name', label=u"模型名称"),
Item('model_file', label=u"文件名"),
Item('category', label=u"模型类型"),
label= u'模型信息',
show_border=True),
Group(
Item('model_number',label=u"模型数量"),
Item('vertices',label=u"顶点数量"),
label= u'统计数据',
show_border=True),
orientation= "horizontal")
)
model=ModelManager()
model.configure_traits(view=view1)
View Code
•Hsplit和VGroup定义水平/垂直并排视图
同样也可以用HSplit和VGroup去生成水平/垂直排列
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item, VGroup, HSplitfrom traitsui.menu importModalButtonsclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Int
vertices=Int
view1=View(#HSplit表示外层垂直排列
HSplit(
VGroup(
Item('model_name', label=u"模型名称"),
Item('model_file', label=u"文件名"),
Item('category', label=u"模型类型"),
label= u'模型信息'),
VGroup(
Item('model_number',label=u"模型数量"),
Item('vertices',label=u"顶点数量"),
label= u'统计数据')
)
)
model=ModelManager()
model.configure_traits(view=view1)
View Code
外层垂直排列
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item, HGroup, VSplitfrom traitsui.menu importModalButtonsclassModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Int
vertices=Int
view1=View(#HSplit表示外层垂直排列
VSplit(
HGroup(
Item('model_name', label=u"模型名称"),
Item('model_file', label=u"文件名"),
Item('category', label=u"模型类型"),
label= u'模型信息'),
HGroup(
Item('model_number',label=u"模型数量"),
Item('vertices',label=u"顶点数量"),
label= u'统计数据')
)
)
model=ModelManager()
model.configure_traits(view=view1)
View Code
内外部视图显示
代码25
from traits.api importHasTraits, Str, Intfrom traitsui.api importView, Item,Groupfrom traitsui.menu importModalButtons
g1= [Item("model_name", label=u"模型名称"),
Item("category", label=u"模型类型")]
g2= [Item("model_number", label=u"模型数量"),
Item("vertices", label=u"顶点数量")]classModelManager(HasTraits):
model_name=Str
category=Str
model_file=Str
model_number=Str
vertices=Int
traits_view=View(
Group(*g1, label = u"模型信息", show_border =True),
Group(*g2, label = u"统计数据", show_border =True),
title= u"内部视图")
global_view=View(
Group(*g1, label = u"模型信息", show_border =True),
Group(*g2, label = u"统计数据", show_border =True),
title= u"外部视图")
model= ModelManager()
View Code
在命令行输入不同代码出现不同界面:
>>> model.configure_traits(view = global_view)
>>> model.configure_traits()
>>> model.configure_traits(view = "traits_view")
如果想要在编辑器中水平并列显示三组group对象
Q1.如果想要在编辑器中水平并列显示三组group对象,应该如何修改group对象的属性?
A1.把原来的Group()改成HGroup()或者在列完3个内层Group同级上写orientation = “horizontal”
Q2.如果想要在编辑器中垂直分标签页显示若干组group对象,可以使用哪些方法?
同理把原来的Group()改成VGroup()或者在列完若干个内层Group()同级上写orientation = “vertical”
6.6.4视图配置
通过kind属性设置view显示类型
显示类型
说明
Modal
模态窗口,非即时更新
Live
非模态窗口,即时更新
Livemodal
模态窗口,即时更新
Nonmodal
非模态窗口,非即时更新
Wizard
向导类型
Panel
嵌入到其他窗口中的面板,即时更新,非模式
Subpanel
显示类型(采用窗口显示内容)
Modal
Live
Livemodal
nonmodal
模态窗口:在窗口关闭之前,其他窗口不能激活;
无模态窗口:在窗口关闭之前,其他窗口能激活;
即时更新:修改空间内容,立即反映到模型数据上;
非即时更新:只有当用户点ok,apply等命令时,效果才会反应在模型上;
Wizard:向导窗口,模态窗口,即时更新;
Panel:向导窗口,模态窗口,即时更新
subpanel :嵌入窗口中的面板
视图配置的实例:view = view(… kind = ‘modal=’)
模态与非模态的小例子
Configure_traits
Edit_traits()
界面显示后,进入消息循环
界面显示后,不进入消息循环
主界面窗口或模态对话框
无模态窗口或对话框
Traits UI按钮配置
标准命令按钮
UndoButton
Applybutton
ReverButton
OKbutton
CancelButton
HelpButton
Traitsui.menu预定义了命令按钮:
OKcancelButtons=[OKButton,CancelButton]
ModelButtons=[ApplyButton,RevertButton,OKButton,CancelButton,HelpButton]
LiveButtons= [UndoButton,ReverButton,OKButton,Cancel]
6.6.5TraitsUI控件
文本编译器:Str, Int
文本编译器与密码窗口:
from traits.api importHasTraits, Str, Passwordfrom traitsui.api importItem, Group, ViewclassTextEditor(HasTraits):#定义文本编辑器变量
string_trait = Str('sample string')
password=Password#定义布局
text_str_group =Group(
Item('string_trait',style = 'simple',label = 'Simple'),
Item("_"),
Item('string_trait',style = 'custom',label = 'Custom'),
Item("_"),
Item('password',style = 'simple',label = 'password'),
)#定义视图
traits_view =View(
text_str_group,
title= 'TextEditor',
buttons= ['OK']
)
代码25 按键触发计数器from traits.api importHasTraits,Button,Intfrom traitsui.api importViewclassButtonEditor(HasTraits):#定义一个Button Trait:
my_button = Button('click Me')
counter=Int#当按钮点击后,处理当按钮被点击后,触发的事件
def_my_button_fired(self):
self.counter+=1
#创建视图
traits_view =View('my_button','counter',
title= 'ButtonEidtor',
buttons= ['OK'],
resizable=True)
button=ButtonEditor()
button.configure_traits()
View Code
代码26 滑动条
from traits.api importHasTraits,Int,Range,Property,property_depends_onfrom traitsui.api importView, Item, RangeEditorclassRangeDemo(HasTraits):
a= Range(1,10)
b= Range(1,10)
c=Property(Int)
view=View(
Item('a'),
Item('b'),'_',
Item('c',editor=RangeEditor(low = 1, high = 20, mode = 'slider')),
Item('c'),
width= 0.3)
@property_depends_on('a,b',settable =True)def_get_c(self):print('computing')return(self.a +self.b)
ran=RangeDemo()
ran.edit_traits()
View Code
text =TextEditor()
text.configure_traits()
按钮Button Editor
监听方法: _TraitName_fired()
TraitName是Button Trait 的名字,即my_button
Def _my_button_fired(self):
Self.counter+= 1
程序框架:
from traits.api import Button #导入控件模块
classButtonEditor(HasTraits):
TraitName= Button() #定义按钮变量名
def _TraitName_fired(self) #定义监听函数
… …
view=View()
button=Button()
button.configure_traits()
菜单、工具栏
From traitsui.menu import Action…
对象
说明
Action
在Menu对象中,通过Action对象定义菜单中的每个选项
ActionGroup
在菜单中的选项中进行分组
Menu
定义菜单栏中的一个菜单
MenuBar
菜单栏对象,由多个Menu对象组成
ToolBar
工具栏对象,它由多个Action对象组成,每个Aciton对应工具挑中的一个按钮
fdf控件列表
对象
说明
Array
数组空间
Bool
单选框、复选框
Button
按钮
Code
代码编辑器
Color
颜色对话框
Directory
目录控件
Enum
枚举控件
File
文件控件
Font
字体选择控件
Html
Html网页控件
List
列表框
Str
文本框
Password
密码控件
Tuple
元组控件
7三维可视化之界面实战
7.1TraitsUI与mayavi实战
7.1.1Mayavi可视化实例
建立mayavi窗口步骤:
1.建立从HasTraits继承的类
a.建立MlabSceneMode场景实例scene
b.建立view视图
c.定义_init_函数,生成数据
2.建立类的实例,调用configure_traits()方法
Numpy 用于建立数据
Traits.api,traitsui.api 用于建立场景模型
Tvtk.pyface.scene_editor 用于建立视图
Tools.mlab_scene_model 用于绘制数据
Core.ui.mayavi_scene 用于绘制数据
7.1.2TraitsUI可视化实例
程序框架
#1.定义HasTraits继承类
Class MyModel(HasTraits):#1.1定义窗口的变量
n_meridional
n_longitudinal
scene#1.2更新视图绘制
@on_trait_change()
Def update_plot(self):
… …#1.3建立视图布局
View = View()
#2.显示窗口
model =MyModel()
Model.configure_traits()
7.1.3三维可视之交互界面homework6
pass见下文url
8三维可视化之总结
8.1客观题练习homework7
pass见下文url
8.2主观题练习
8.2.1练习1
请参考SV11V02“TraitsUI可视化实例”,将本课程所学的TVTK或者Mayavi可视化例子,补充TraitsUI的交互控制,即通过TraitsUI的交互控制能够实现可视化视图中参数的相应改变,交互控件的种类不少于2种(如滑动条、文本框)、交互控件数量不少于3个(如2个滑动条、1个文本框)。要求代码规范,有注释。
SV11V02 TraitsUI可视化实例参考代码
一个简单的例子,在原有基础上,融合了文本框和[‘OK’]按钮
from traits.api importHasTraits, Range, Instance, on_trait_changefrom traitsui.api importView, Item, Groupfrom mayavi.core.api importPipelineBasefrom mayavi.core.ui.api importMayaviScene, SceneEditor, MlabSceneModelfrom numpy importarange, pi, cos, sin
dphi= pi/300.
phi= arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')defcurve(n_mer, n_long):
mu= phi*n_mer
x= cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
y= sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
z= 0.5 * sin(n_long*mu/n_mer)
t=sin(mu)returnx, y, z, tclassMyModel(HasTraits):
n_meridional= Range(0, 30, 6)
n_longitudinal= Range(0, 30, 11)#场景模型实例
scene =Instance(MlabSceneModel, ())#管线实例
plot =Instance(PipelineBase)#当场景被激活,或者参数发生改变,更新图形
@on_trait_change('n_meridional,n_longitudinal,scene.activated')defupdate_plot(self):
x, y, z, t=curve(self.n_meridional, self.n_longitudinal)if self.plot is None:#如果plot未绘制则生成plot3d
self.plot =self.scene.mlab.plot3d(x, y, z, t,
tube_radius=0.025, colormap='Spectral')else:#如果数据有变化,将数据更新即重新赋值
self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)#建立视图布局
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=250, width=300, show_label=False),
Group('_', 'n_meridional', 'n_longitudinal'),
resizable=True)
model=MyModel()
model.configure_traits()
View Code
代码27 view_range_text
from traits.api importHasTraits, Range, Instance, on_trait_change, Str, Int, Buttonfrom traitsui.api importView, Item, Groupfrom mayavi.core.api importPipelineBasefrom mayavi.core.ui.api importMayaviScene, SceneEditor, MlabSceneModelfrom numpy importarange, pi, cos, sin
dphi= pi/300.
phi= arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')defcurve(n_mer, n_long):
mu= phi*n_mer
x= cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
y= sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
z= 0.5 * sin(n_long*mu/n_mer)
t=sin(mu)returnx, y, z, tclassMyModel(HasTraits):
n_meridional= Range(0, 30, 6)
n_longitudinal= Range(0, 30, 11)#场景模型实例
scene =Instance(MlabSceneModel, ())#管线实例
plot =Instance(PipelineBase)#当场景被激活,或者参数发生改变,更新图形
@on_trait_change('n_meridional,n_longitudinal,scene.activated')defupdate_plot(self):
x, y, z, t=curve(self.n_meridional, self.n_longitudinal)if self.plot is None:#如果plot未绘制则生成plot3d
self.plot =self.scene.mlab.plot3d(x, y, z, t,
tube_radius=0.025, colormap='Spectral')else:#如果数据有变化,将数据更新即重新赋值
self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)#建立视图布局
view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
height=250, width=300, show_label=False), #图形窗口界面
Group('_', 'n_meridional', #滑动条
Item('model_name',label=u'模型名称'), #模型名称文本框
Item('model_file',label=u'文件名'),
Item('category',label=u'模型类型'),
label= (u'模型信息'),
show_border=True
),
title= 'view_range_text',
buttons= ['OK'],
resizable=True, #改变窗口大小
)
model_name=Str
category=Str
model_file=Str
model_number=Int
model=MyModel()
model.configure_traits()
View Code
参考SV09V02“TraitsUI可视化实例”,将本课程所学的TVTK或者Mayavi可视化例子,补充TraitsUI的交互控制,即通过TraitsUI的交互控制能够实现可视化视图中参数的相应改变,交互控件的种类不少于3种(如滑动条、文本框、颜色对话框)、交互控件数量不少于3个(如1个滑动条、1个文本框、1个颜色对话框)。要求代码规范,有注释。
8.2.2练习2
SV09V02“TraitsUI可视化实例”参考代码:
from traits.api importDelegate, HasTraits, Instance, Int, StrclassParent(HasTraits):#初始化
last_name = Str('Zhang')classChild(HasTraits):
age=Int#验证
father =Instance(Parent)#代理
last_name = Delegate('father')#监听
def_age_changed(self, old, new):print('Age change from %s to %s' % (old, new))
代码28 在TraitsUI中嵌入mayavi
颜色对话框没有找到,不会实现这个功能,不过添加了一个点击绘图的命令,代码稍微修改了下,添加了_plotbutton_fired(self)和plot(self)函数,同时在绘图之前要给图形一个初始化,在出现图形界面后,再动态监听图形参数的变化
#-*- coding: utf-8 -*-
from traits.api import *
from traits.api importHasTraits, Range, Instance, on_trait_change, Str, Int, Buttonfrom traitsui.api importView, Item, VGroup,Groupfrom mayavi.core.api importPipelineBasefrom mayavi.core.ui.api importMayaviScene, SceneEditor, MlabSceneModelfrom numpy importarange, pi, cos, sin
dphi= pi/300.
phi= arange(0.0, 2*pi + 0.5*dphi, dphi, 'd')defcurve(n_mer, n_long):
mu= phi*n_mer
x= cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
y= sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5)
z= 0.5 * sin(n_long*mu/n_mer)
t=sin(mu)returnx, y, z, tclassDemoApp(HasTraits):
n_meridional= Range(0, 30, 6)
n_longitudinal= Range(0, 30, 11)
plotbutton= Button(u"绘图")#场景模型实例
scene =Instance(MlabSceneModel,())#当场景被激活,或者参数发生改变,更新图形
@on_trait_change('n_meridional,n_longitudinal,scene.activated')defupdate_plot(self):
x, y, z, t=curve(self.n_meridional, self.n_longitudinal)if self.plot is None:#如果plot未绘制则生成plot3d
self.plot =self.scene.mlab.plot3d(x, y, z, t,
tube_radius=0.025, colormap='Spectral')else:#如果数据有变化,将数据更新即重新赋值
self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t)#建立视图
view =View(
Item('scene', editor=SceneEditor(scene_class=MayaviScene),height=250, width=300,show_label=False), #图形窗口界面
Group('_','n_meridional','n_longitudinal',
Item('model_name',label=u'模型名称'),
Item('model_file',label=u'文件名'),
Item('category',label=u'模型类型'),'plotbutton',
show_border=True
),
title= 'view_range_text',
buttons= ['OK'],
resizable=True, #可变窗口大小
)def_plotbutton_fired(self):
self.plot()defplot(self):#管线实例,初始化函数
plot =Instance(PipelineBase)
x, y, z, t=curve(self.n_meridional, self.n_longitudinal)
self.plot= self.scene.mlab.plot3d(x, y, z, t,tube_radius=0.025, colormap='Spectral')
model_name=Str
category=Str
model_file=Str
app=DemoApp()
app.configure_traits()
View Code
本博客中能提供到的
1.pdfhomework文本和答案;
2.部分数据集代码,如果选哟全部数据集,最好还是取中国MOOC顶部的url课程链接中下载,资料全;
3.关于这个课程,我做过编程训练的代码
4.pdf课程笔记。
github地址:here,上面对应的资料都在里面,不专业,不过代码都走了一遍,有些问题也想了下,供参考。
关于如何git上传,转一下这个大佬帖子,here
简单老说就是以下几个步骤:
1).在github中创建好新的repository,如下图,其次就是命名,其他默认即可。
2).把要上传的文件装在一个文件夹下;
3).右击这个文件夹,会出现git Bash和git GUI这个命令,点击git Bash(前提是已经装好了git);
4).进入git Bash后,是这个界面
5).刚才创建好的repository里,复制链接
6).截下来在git Bash中输入下面命令
a)git clone xxxx(刚才复制的地址),此时在本地要上传的文件夹里会多出一个文件夹(同文件名github中,创建的repository),比如我是Visualization;
e.g. git clone https://github.com/nityuyukun/Visualization.git
b).切换到本地仓库的文件夹,比如Visualiazation
c)git add . //注意add后有一个空格,再加点,加点表示上传所有文件到本地仓库;
d)git commit -m "xxx" //"xxx"中的xxx可以任意替换,表示想要备注的名字,比如我下面是second commit,这一步表示确认上传所有文件到本地仓库,并备份;
这两步完后,出现下图
e)git push -u origin master 这一步表示把本地仓库里的东西推到github上。
finished.
python三维转换教程_Python科学计算三维可视化【完结】相关推荐
- python np dot函数_python科学计算之Numpy
Numpy的组成与功能 Numpy(Numeric Python)可以被理解为一个用python实现的科学计算包,包括: 1.强大的N维数组对象Array: 2.成熟的函数库: 3.实用的线性代数.傅 ...
- python矩阵sin计算器_Python科学计算工具
Python科学计算工具-Numpy入门 2017.07.02 20:29:14字数 1,404阅读 2,509 一:前言 学了中国大学mooc的Python数据分析与展示课程感觉挺不错的,记录下来以 ...
- python中ndarray除_python科学计算_numpy_ndarray
ndarray:n-dimensional array object,即多维数组对象,是python自带的array对象的扩展,array对象和list对象的区别是array对象的每一个元素都是数值, ...
- Python大数据教程:科学计算库NumPy案例之酒鬼漫步
通过前面对NumPy的学习,相信大家一定对NumPy这个科学计算包有了一定的了解,接下来,本节将通过酒鬼漫步的案例来介绍如何运用NumPy随机数模块与数据处理. 下面先为大家描述一下场景,在一片空旷的 ...
- python中符号计算三维可视化_Python科学计算三维可视化章节答案
科学可视细胞衰老和死亡不止发生在生物个体衰老时. 参考答案如下 计算节答糖尿病患者需要紧急救治的情况化章糖尿病患者每日食物的组成中,碳水化合物应占多少? 科学可视糖尿病患者饮食中应注意补充下列微量元素 ...
- python打印等腰梯形_Python科学计算三维可视化中国大学慕课测试答案2020年_电工学(电工技术)(山东联盟)_知到_章节测试答案...
参考答案如下 ( )公德要求,科学可视课测体现了对社会共同劳动成果的珍惜与爱护,同时也是个人道德修水平与社会文明的重要标志. 建筑火灾烟气蔓延的途径主要有(),计算节测楼梯间,各种竖井管道,楼板的孔洞 ...
- python科学计算可视化好慢_Python科学计算三维可视化 1
1.二维标量数据场 颜色映射法 等值 立体图法 层次分割法 2.三维标量数据场 面绘制 体绘制 3.矢量数据场 直接(箭头 线段 色轮) 流线法 TVTK相关安装 http://code.enthou ...
- python中符号计算三维可视化_Python科学计算三维可视化_答案mooc
马格德堡半球实验是关于真空是否存在的实验.() 马来西亚历史上的第一个封建王国称为: 马林巴传入拉丁美洲大约是在什么时候? 马林科夫准备把苏联发展重点放在农业上. 马步是模仿蒙古人()的动作 马林诺夫 ...
- python下表运算_python科学计算_numpy_广播与下标
多维数组下标 多维数组的下标是用元组来实现每一个维度的,如果元组的长度比维度大则会出错,如果小,则默认元组后面补 : 表示全部访问: 如果一个下标不是元组,则先转换为元组,在转换过程中,列表和数组的转 ...
- python数组去重函数_Python科学计算库Numpy之 数组操作
操作ndarray 的方法 numpy.reshape:这个函数在不改变数据的条件下修改形状 numpy.ndarray.flat:该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器 ...
最新文章
- 算法(5) 归并排序
- 《分布式操作系统》知识点(1~7)一
- 安全感与职业发展的几点思考
- ITK:计算图像的最小,最大,方差和均值
- C语言学习之输入任意年份,判断是否为闰年
- 方法性能分析器--装饰者模式应用
- 解决ffmpeg拉流转发频繁丢包问题max delay reached. need to consume packet
- 服务器报告它来自digest_【关注】服务器行业现状研究
- Java基础学习总结(38)——Lombok(消除冗长的 java 代码)的使用和原理及安装、入门使用
- Spring Cloud Gateway (七)处理流程解析
- appium-python 学习记录
- Linux 信号量互斥编程
- [原创]SpringBoot上传图片踩的坑
- 局域网操作技巧与配置实例
- c#时间 转换成java_Java与C#时间转换
- tcpip详解有必要看吗_全屋净水知识|前置过滤器有必要安装吗?看完秒懂
- 解决python中No module named ‘numpy‘问题
- 数据仓库-6.元数据管理
- Python pip自动管理脚本
- 程序员必备的17个软件开发工具,你常用的有几个?
热门文章
- Linux 命令完全手册
- Linux系统p4vasp使用教程,科学网—p4vasp on Linux - 单光存的博文
- Tableau Desktop 最新版安装教程
- python清屏失败,如何在 Python 中清屏
- pygame判断鼠标左键_鼠标科普,选对鼠标用好鼠标。
- 去除CSDN广告的方法
- 利用模板导出文件(一)之XLSTransformer导出excel文件
- 视频教程-嵌入式Linux驱动开发-嵌入式
- Python语言程序设计----【第8周 程序设计方法学】之8.2 Python程序设计思维
- 锐起无盘服务器设置教程,“锐起无盘XP”教程安装调试教程