Pyvista---(2)pyvista中的mesh定义
程序员文章站
2022-07-14 16:29:23
...
- 为了简化数据表示的复杂度,在pyvista中,mesh可以表示面,也可以表示体素。
- pyvista里面的所有数据都有节点(node),节点是网格的顶点,由XYZ坐标表示,即使是二维数据也是要有XYZ坐标。
- 数据也可以是只包含顶点,比如点云(point cloud),点云是一群点。
0 mesh 三要素
- 顶点(node)
- 格子(cell)
- 值(attributes):可以是顶点的值也可以是格子的值,如果设置顶点的值那么颜色就是渐变的,设置格子的值颜色就是不渐变的。
1 mesh中的顶点
下面以三个例子说明
1.1 点云
- 可以用
pyvista.PolyData
来创建点云,也就是创建一个包含点的数据结构,可以是二维的也可以是三维的,然后这个数据是可以用来被可视化的。 - 用numpy生成一堆点云的坐标,然后转为用vista可视化出来。
import numpy as np
import pyvista as pv
nodes = np.random.rand(100, 3)
mesh = pv.PolyData(nodes)
mesh.plot(point_size=10, screenshot='random_nodes.png')
结果:
1.2 网格(gridded mesh),三维数组
import pyvista as pv
from pyvista import examples
mesh = examples.load_hexbeam()
p = pv.Plotter() ## 建一个画板
# 然后在画板上画图
p.add_mesh(mesh, show_edges=True, color='white')
p.add_mesh(pv.PolyData(mesh.points), color='red', point_size=10, render_points_as_spheres=True)
## 相机位置
p.camera_position = [(6.20, 3.00, 7.50),
(0.16, 0.13, 2.65),
(-0.28, 0.94, -0.21)]
p.show(screenshot='beam_nodes.png')
结果:
1.3 三角表面,兔子
mesh = examples.download_bunny_coarse()
p = pv.Plotter()
p.add_mesh(mesh, show_edges=True, color='white')
p.add_mesh(pv.PolyData(mesh.points), color='red',
point_size=10, render_points_as_spheres=True)
p.camera_position = [(0.02, 0.30, 0.73),
(0.02, 0.03, -0.022),
(-0.03, 0.94, -0.34)]
p.show(screenshot='bunny_nodes.png')
结果:
2 mesh中的 cell(单元),小格子
- 如果了解医学图像处理的话,ct中的一个体素就是一个cell。
- 当然,单元不仅限于体素,它们可以是三个节点之间的三角形,两个节点之间的线,甚至单个节点也可以是其自己的单元(但这是特例)。
如图所示:
在前面的代码上加上这句话即可画出上图:
p.add_mesh(mesh.extract_cells(mesh.n_cells-1),
color='pink', edge_color='blue',
line_width=5, show_edges=True)
3 mesh中的属性(attributes),颜色
- 给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。
- 之前说的顶点是坐标点,那这个属性就是这个坐标点的值。简单来说顶点是矩阵的坐标,属性就是矩阵里面的值。那么值被可视化出来就是灰度了。毕竟在图像中矩阵的值就表示灰度值。
- 可以通过
.point_arrays
或.cell_arrays
方法来给mesh赋值。值可以是point的或是cell的,通过这个两个方法。这两个方法是一个字典。 - point数据是指存在于网格的每个节点上的值的数组(标量,向量等)。该数组的顺序至关重要!属性数组中的每个元素必须对应于网格中的节点或单元。
import pyvista as pv
from pyvista import examples
mesh = examples.load_hexbeam()
camera_position = [(6.20, 3.00, 7.50),
(0.16, 0.13, 2.65),
(-0.28, 0.94, -0.21)]
# 这里是给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。
mesh.point_arrays['my point values'] = np.arange(mesh.n_points)
mesh.plot(scalars='my point values', cpos=camera_position,
show_edges=True, screenshot='beam_point_data.png')
- 这里是给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。
给格子(cell)赋值
mesh.cell_arrays['my cell values'] = np.arange(mesh.n_cells)
mesh.plot(scalars='my cell values', cpos=bcpos,
show_edges=True, screenshot='beam_cell_data.png')
链接
- https://docs.pyvista.org/getting-started/what-is-a-mesh.html
推荐阅读
-
YII2框架中添加自定义模块的方法实例分析
-
在 Angular2 中实现自定义校验指令(确认密码)的方法
-
Python中的Function定义方法第1/2页
-
YII2框架中添加自定义模块的方法实例分析
-
Pyvista---(2)pyvista中的mesh定义
-
对angularJs中2种自定义服务的实例讲解
-
游戏数据传输帧同步中,自定义浮点(float)、二维向量(vector2)、三维向量(vecter3)、四元数(Quaternion)的数据类型的实现
-
Angularjs进阶笔记(2)-自定义指令中的数据绑定
-
如何在TensorFlow2.X中使用自定义训练循环的情况下在TensorBoard中绘制网络结构图(计算图)
-
Python中的Function定义方法第1/2页