1+1=10

记记笔记,放松一下...

PyVista使用小记(一)

接前面PySide6下PyVista小记,简单看看PyVista的用法。

简单几何对象(Geometric Objects)

对于常见了简单几何对象,PyVista提供了高层次封装的方法。

二维对象

对于2D形状:圆弧、圆盘、圆、线、折线、多边形、平面

pyvista 2d geometries

  • Circle([radius, resolution]): 创建一个平面上的圆形。
  • CircularArc(pointa, pointb, center[, ...]): 创建一个由两个端点和中心定义的圆弧。
  • CircularArcFromNormal(center[, resolution, ...]): 创建一个与法线平面相切的圆弧。
  • Disc([center, inner, outer, normal, r_res, ...]): 创建一个带孔的二维圆盘。
  • Line([pointa, pointb, resolution]): 创建一条线段。
  • Plane([center, direction, i_size, j_size, ...]): 创建一个平面,尽管是3D空间中的对象,但通常在二维几何中处理,定义了一个无限平面。
  • Triangle([[points]]): 创建三级形
  • Rectangle([[points]]): 创建矩形
  • MultipleLines([points]): 创建多条线,属于二维。
  • Polygon([center, radius, normal, n_sides, fill]): 创建一个多边形。

示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import pyvista as pv
import numpy as np

plotter = pv.Plotter(shape=(3, 4))  # 定义一个3行4列的布局

# Circle - 创建一个圆
plotter.subplot(0, 0)
circle = pv.Circle(radius=1.0, resolution=50)
plotter.add_text("Circle", font_size=12)
plotter.add_mesh(circle, color="cyan", show_edges=True)

# CircularArc - 创建一个圆弧
plotter.subplot(0, 1)
arc = pv.CircularArc([-1, 1, 0], [1, 1, 0], center=[0, 0, 0], resolution=50)
plotter.add_text("Circular Arc", font_size=12)
plotter.add_mesh(arc, color="yellow", line_width=3)

# CircularArcFromNormal - 创建一个圆弧
plotter.subplot(0, 2)
arc = pv.CircularArcFromNormal(center=[0, 0, 0], normal=[0, 0, 1], angle=180, resolution=50)
plotter.add_text("Circular Arc From Normal", font_size=12)
plotter.add_mesh(arc, color="cyan", line_width=3)

# Disc - 创建一个圆盘
plotter.subplot(0, 3)
disc = pv.Disc(center=[0, 0, 0], inner=0.5, outer=1.0, r_res=30, c_res=30)
plotter.add_text("Disc", font_size=12)
plotter.add_mesh(disc, color="orange", show_edges=True)

# Line - 创建一条线段
plotter.subplot(1, 0)
line = pv.Line(pointa=[-1, 0, 0], pointb=[1, 0, 0], resolution=10)
plotter.add_text("Line", font_size=12)
plotter.add_mesh(line, color="green", line_width=3)

# MultipleLines - 创建多条线
plotter.subplot(1, 1)
points = np.array([[0, 0, 0], [1, 1, 0], [2, 0, 0], [3, 1, 0]])
lines = pv.MultipleLines(points)
plotter.add_text("Multiple Lines", font_size=12)
plotter.add_mesh(lines, color="blue", line_width=3)

# Plane - 创建一个平面
plotter.subplot(1, 2)
plane = pv.Plane(center=[0, 0, 0], direction=[0, 0, 1], i_size=2, j_size=2)
plotter.add_text("Plane", font_size=12)
plotter.add_mesh(plane, color="lightblue", show_edges=True)

# Polygon - 创建一个多边形
plotter.subplot(1, 3)
polygon = pv.Polygon(radius=1.0, n_sides=6)
plotter.add_text("Polygon", font_size=12)
plotter.add_mesh(polygon, color="purple", show_edges=True)

# Triangle - 创建一个三角形
plotter.subplot(2, 0)
triangle = pv.Triangle()
plotter.add_text("Triangle", font_size=12)
plotter.add_mesh(triangle, color="red", show_edges=True)

# Rectangle - 创建一个矩形
plotter.subplot(2, 1)
rectangle = pv.Rectangle()
plotter.add_text("Rectangle", font_size=12)
plotter.add_mesh(rectangle, color="green", show_edges=True)

# 展示所有形状
plotter.show("Demo for 2D Geometries")

三维对象

有点多,分成两部分:

3d_geometries

  • Arrow([start, direction, tip_length, ...]): 创建一个箭头
  • Box([bounds, level, quads]): 创建一个具有固体面的盒子
  • Capsule([center, direction, radius, ...]): 创建胶囊体
  • Cone([center, direction, height, radius, ...]): 创建一个圆锥体
  • Cube([center, x_length, y_length, z_length, ...]): 创建一个立方体
  • Cylinder([center, direction, radius, ...]): 创建一个圆柱体的表面
  • CylinderStructured([radius, height, center, ...]): 创建一个圆柱体网* `格,属于三维。
  • Dodecahedron([radius, center]): 创建一个十二面体
  • Icosahedron([radius, center]): 创建一个二十面体
  • Icosphere([radius, center, nsub]): 创建一个二十面体球
  • Tetrahedron([radius, center]): 创建一个四面体
  • Octahedron([radius, center]): 创建一个八面体
  • Superquadric([center, scale, size, ...]): 创建一个超二次体
  • Sphere([radius, center, direction, ...]): 创建一个球体

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import pyvista as pv
import numpy as np

# 创建一个 Plotter 实例,设置布局为 3x4
plotter = pv.Plotter(shape=(3, 4))

# 创建箭头
arrow = pv.Arrow(start=(0, 0, 0), direction=(1, 1, 1), tip_length=0.2)
plotter.subplot(0, 0)
plotter.add_text("Arrow", font_size=12)
plotter.add_mesh(arrow, color="cyan", line_width=3)

# 创建盒子
box = pv.Box(bounds=(0, 1, 0, 1, 0, 1))
plotter.subplot(0, 1)
plotter.add_text("Box", font_size=12)
plotter.add_mesh(box, color="magenta")

# 创建胶囊体
capsule = pv.Capsule(center=(0, 0, 0), direction=(1, 0, 0), radius=0.5, cylinder_length=2)
plotter.subplot(0, 2)
plotter.add_text("Capsule", font_size=12)
plotter.add_mesh(capsule, color="green")

# 创建圆锥体
cone = pv.Cone(center=(0, 0, 0), direction=(0, 1, 0), height=2, radius=0.5)
plotter.subplot(0, 3)
plotter.add_text("Cone", font_size=12)
plotter.add_mesh(cone, color="red")

# 创建立方体
cube = pv.Cube(center=(0, 0, 0), x_length=1, y_length=1, z_length=1)
plotter.subplot(1, 0)
plotter.add_text("Cube", font_size=12)
plotter.add_mesh(cube, color="yellow")

# 创建圆柱体
cylinder = pv.Cylinder(center=(0, 0, 0), direction=(0, 0, 1), radius=0.5, height=2)
plotter.subplot(1, 1)
plotter.add_text("Cylinder", font_size=12)
plotter.add_mesh(cylinder, color="blue")

# 创建十二面体
dodecahedron = pv.Dodecahedron(radius=1)
plotter.subplot(1, 2)
plotter.add_text("Dodecahedron", font_size=12)
plotter.add_mesh(dodecahedron, color="orange")

# 创建二十面体
icosahedron = pv.Icosahedron(radius=1)
plotter.subplot(1, 3)
plotter.add_text("Icosahedron", font_size=12)
plotter.add_mesh(icosahedron, color="purple")

# 创建四面体
tetrahedron = pv.Tetrahedron(radius=1)
plotter.subplot(2, 0)
plotter.add_text("Tetrahedron", font_size=12)
plotter.add_mesh(tetrahedron, color="pink")

# 创建八面体
octahedron = pv.Octahedron(radius=1)
plotter.subplot(2, 1)
plotter.add_text("Octahedron", font_size=12)
plotter.add_mesh(octahedron, color="red")

# 创建超二次体
superquadric = pv.Superquadric(center=(0, 0, 0), scale=(1, 1, 1), size=0.5)
plotter.subplot(2, 2)
plotter.add_text("Superquadric", font_size=12)
plotter.add_mesh(superquadric, color="cyan")

# 创建球体
sphere = pv.Sphere(radius=1, center=(0, 0, 0))
plotter.subplot(2, 3)
plotter.add_text("Sphere", font_size=12)
plotter.add_mesh(sphere, color="grey")

# 展示所有绘图
plotter.show()

3d

  • PlatonicSolid([kind, radius, center]): 创建一个柏拉图立体(正四、六、八、十二、二十)面体
    • 'tetrahedron'
    • 'cube'
    • 'octahedron'
    • 'icosahedron'
    • 'dodecahedron'
  • Pyramid([points]): 创建一个金字塔
  • SolidSphere([outer_radius, inner_radius, ...]): 创建一个实心球
  • SolidSphereGeneric([radius, theta, phi, ...]): 创建一个灵活采样的实心球 ,属于三维。
  • Text3D(string[, depth, width, height, ...]): 创建三维文字
  • Tube([pointa, pointb, resolution, radius, ...]): 创建一个管道
  • Wavelet([extent, center, maximum, x_freq, ...]): 创建一个波形,有些复杂...

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import pyvista as pv
import numpy as np

plotter = pv.Plotter(shape=(2, 4))

# 创建柏拉图立体
platonic_solid = pv.PlatonicSolid(kind='tetrahedron', radius=1, center=(0, 0, 0))
plotter.subplot(0, 0)
plotter.add_text("Platonic Solid", font_size=12)
plotter.add_mesh(platonic_solid, color="cyan")

# 创建金字塔
pyramid_points = np.array([
    [0, 0, 0],
    [1, 0, 0],
    [1, 1, 0],
    [0, 1, 0],
    [0.5, 0.5, 1]
])
pyramid = pv.Pyramid(pyramid_points)
plotter.subplot(0, 1)
plotter.add_text("Pyramid", font_size=12)
plotter.add_mesh(pyramid, color="magenta")

# 创建实心球
solid_sphere = pv.SolidSphere(outer_radius=1, inner_radius=0.5)
plotter.subplot(0, 2)
plotter.add_text("Solid Sphere", font_size=12)
plotter.add_mesh(solid_sphere, color="green")

# 创建灵活采样的实心球
solid_sphere_generic = pv.SolidSphereGeneric(
    radius=np.linspace(0, 0.5, 2),
    theta=np.linspace(180, 360, 30),
    phi=np.linspace(0, 180, 30),
)
plotter.subplot(0, 3)
plotter.add_text("Solid Sphere Generic", font_size=12)
plotter.add_mesh(solid_sphere_generic, color="red")

# 创建三维文字
text3d = pv.Text3D("3D Text", depth=0.1, width=0.5, height=0.5)
plotter.subplot(1, 0)
plotter.add_text("Text3D", font_size=12)
plotter.add_mesh(text3d, color="blue")

# 创建管道
tube = pv.Tube((0, 0, 0), (0, 0, 1), resolution=50, radius=0.1)
plotter.subplot(1, 1)
plotter.add_text("Tube", font_size=12)
plotter.add_mesh(tube, color="yellow")

# 创建波形
wavelet = pv.Wavelet(
    extent=(0, 50, 0, 50, 0, 10),
    x_freq=20,
    y_freq=10,
    z_freq=1,
    x_mag=100,
    y_mag=100,
    z_mag=1000,
)
plotter.subplot(1, 2)
plotter.add_text("Wavelet", font_size=12)
plotter.add_mesh(wavelet, color="orange")

# 创建多个线段 (MultipleLines)
lines_points = np.array([
    [0, 0, 0],
    [1, 1, 1],
    [2, 2, 0],
    [3, 1, 1],
    [4, 0, 0]
])
multiple_lines = pv.MultipleLines(lines_points)
plotter.subplot(1, 3)
plotter.add_text("Multiple Lines", font_size=12)
plotter.add_mesh(multiple_lines, color="purple")

# 展示所有绘图
plotter.show()

几何源(Geometric Sources)

几何源(Geometric Sources)更接近实际的 VTK 管道。它们在 VTK 管道中充当“源”节点,生成特定类型的几何体。

  • 管道集成:这些源旨在集成到 VTK 管道中,其输出可以直接连接到其他管道阶段,如过滤器、映射器等。
  • 精细控制:它们通常提供更多参数来控制几何体,更适用于需要对生成几何体进行细粒度控制的场景。

sources

  • ArrowSource([tip_length, tip_radius, ...]):创建一个箭头源。
  • AxesGeometrySource([[, shaft_type, ...]]):创建坐标轴几何源。注意和其他source的类型不同,需要调用 output。
  • BoxSource([bounds, level, quads]):创建一个盒子源。
  • ConeSource([center, direction, height, ...]):圆锥源算法类。
  • CubeSource([center, x_length, y_length, ...]):立方体源算法类。
  • CylinderSource([center, direction, radius, ...]):圆柱源算法类。
  • DiscSource([center, inner, outer, r_res, c_res]):圆盘源算法类。
  • LineSource([pointa, pointb, resolution]):创建一条线。
  • MultipleLinesSource([points]):多条线源算法类。
  • PlaneSource([i_resolution, j_resolution]):创建一个平面源。
  • PlatonicSolidSource([kind]):柏拉图立体源算法类。(正四、六、八、十二、二十面体)
  • PolygonSource([center, radius, normal, ...]):多边形源算法类。
  • SphereSource([radius, center, ...]):球体源算法类。
  • SuperquadricSource([center, scale, size, ...]):创建超二次曲面源。
  • Text3DSource([string, depth, width, height, ...]):从字符串创建 3D 文字。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import pyvista as pv
import numpy as np

# 创建一个 Plotter 实例,设置网格布局
plotter = pv.Plotter(shape=(4, 4))  # 4x4布局

# ArrowSource - 箭头
plotter.subplot(0, 0)
arrow = pv.ArrowSource(tip_length=0.3, tip_radius=0.1, shaft_radius=0.05)
plotter.add_text("Arrow Source", font_size=10)
plotter.add_mesh(arrow, color="cyan")

# AxesGeometrySource - 坐标轴
plotter.subplot(0, 1)
axes = pv.AxesGeometrySource(shaft_type='cylinder')
plotter.add_text("Axes Geometry Source", font_size=10)
plotter.add_mesh(axes.output, color="red")

# BoxSource - 盒子
plotter.subplot(0, 2)
box = pv.BoxSource(bounds=(0, 1, 0, 1, 0, 1))
plotter.add_text("Box Source", font_size=10)
plotter.add_mesh(box, color="magenta", show_edges=True)

# ConeSource - 圆锥
plotter.subplot(0, 3)
cone = pv.ConeSource(center=(0, 0, 0), direction=(0, 1, 0), height=2.0, radius=0.5)
plotter.add_text("Cone Source", font_size=10)
plotter.add_mesh(cone, color="orange")

# CubeSource - 立方体
plotter.subplot(1, 0)
cube = pv.CubeSource(center=(0, 0, 0), x_length=1, y_length=1, z_length=1)
plotter.add_text("Cube Source", font_size=10)
plotter.add_mesh(cube, color="yellow", show_edges=True)

# CylinderSource - 圆柱
plotter.subplot(1, 1)
cylinder = pv.CylinderSource(center=(0, 0, 0), radius=0.5, height=2.0)
plotter.add_text("Cylinder Source", font_size=10)
plotter.add_mesh(cylinder, color="green")

# DiscSource - 圆盘
plotter.subplot(1, 2)
disc = pv.DiscSource(center=(0, 0, 0), inner=0.3, outer=0.6, r_res=30, c_res=30)
plotter.add_text("Disc Source", font_size=10)
plotter.add_mesh(disc, color="lightblue")

# LineSource - 线段
plotter.subplot(1, 3)
line = pv.LineSource(pointa=(0, 0, 0), pointb=(1, 1, 0), resolution=10)
plotter.add_text("Line Source", font_size=10)
plotter.add_mesh(line, color="purple", line_width=3)

# MultipleLinesSource - 多条线
plotter.subplot(2, 0)
points = np.array([[0, 0, 0], [1, 1, 0], [2, 0, 0], [3, 1, 0]])
lines = pv.MultipleLinesSource(points)
plotter.add_text("Multiple Lines Source", font_size=10)
plotter.add_mesh(lines, color="blue", line_width=3)

# PlaneSource - 平面
plotter.subplot(2, 1)
plane = pv.PlaneSource(i_resolution=10, j_resolution=10)
plotter.add_text("Plane Source", font_size=10)
plotter.add_mesh(plane, color="pink", show_edges=True)

# PlatonicSolidSource - 柏拉图立体
plotter.subplot(2, 2)
platonic = pv.PlatonicSolidSource(kind='dodecahedron')
plotter.add_text("Platonic Solid Source", font_size=10)
plotter.add_mesh(platonic, color="grey")

# PolygonSource - 多边形
plotter.subplot(2, 3)
polygon = pv.PolygonSource(center=(0, 0, 0), radius=1.0, normal=(0, 0, 1), n_sides=6)
plotter.add_text("Polygon Source", font_size=10)
plotter.add_mesh(polygon, color="brown", show_edges=True)

# SphereSource - 球体
plotter.subplot(3, 0)
sphere = pv.SphereSource(radius=0.8, center=(0, 0, 0))
plotter.add_text("Sphere Source", font_size=10)
plotter.add_mesh(sphere, color="cyan")

# SuperquadricSource - 超二次曲面
plotter.subplot(3, 1)
superquadric = pv.SuperquadricSource(center=(0, 0, 0), scale=(0.8, 0.8, 0.8), size=1.0)
plotter.add_text("Superquadric Source", font_size=10)
plotter.add_mesh(superquadric, color="red")

# Text3DSource - 3D文字
plotter.subplot(3, 2)
text3d = pv.Text3DSource("PyVista", depth=0.2, width=1.0, height=0.5)
plotter.add_text("Text 3D Source", font_size=10)
plotter.add_mesh(text3d, color="gold")

# 展示所有形状
plotter.show()

参数化几何对象(Parametric Geometric Objects)

parametric surfaces

  • ParametricBohemianDome([a, b, c]): 生成波希米亚穹顶表面。
  • ParametricBour(**kwargs): 生成布尔最小曲面。
  • ParametricBoy([zscale]): 生成博伊曲面。
  • ParametricDini([a, b]): 生成迪尼曲面。
  • ParametricCatalanMinimal(**kwargs): 生成卡塔兰最小曲面。
  • ParametricConicSpiral([a, b, c, n]): 生成类似海贝壳的圆锥螺旋曲面。
  • ParametricCrossCap(**kwargs): 生成交叉帽。
  • ParametricEllipsoid([xradius, yradius, zradius]): 生成椭圆体。
  • ParametricEnneper(**kwargs): 生成恩内珀曲面。
  • ParametricFigure8Klein([radius]): 生成8字型克莱因瓶。
  • ParametricHenneberg(**kwargs): 生成亨内贝格最小曲面。
  • ParametricKlein(**kwargs): 生成经典克莱因瓶表示。
  • ParametricKuen([deltav0]): 生成库恩曲面。
  • ParametricMobius([radius]): 生成莫比乌斯带。
  • ParametricPluckerConoid([n]): 生成普吕克圆锥面。
  • ParametricPseudosphere(**kwargs): 生成假球面。
  • ParametricRandomHills([numberofhills, ...]): 生成覆盖随机山丘的曲面。
  • ParametricRoman([radius]): 生成斯坦纳的罗马曲面。
  • ParametricSuperEllipsoid([xradius, yradius, ...]): 生成超椭圆体。
  • ParametricSuperToroid([ringradius, ...]): 生成超圆环。
  • ParametricTorus([ringradius, crosssectionradius]): 生成圆环面。

示例代码

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import pyvista as pv
import numpy as np

# 初始化 Plotter
plotter = pv.Plotter(shape=(6, 4))

# ParametricBohemianDome - 生成一个波希米亚穹顶
plotter.subplot(0, 0)
bohemian_dome = pv.ParametricBohemianDome(a=1.0, b=0.5, c=1.0)
plotter.add_text("Bohemian Dome", font_size=12)
plotter.add_mesh(bohemian_dome, color="cyan")

# ParametricBour - 生成 Bour 的最小曲面
plotter.subplot(0, 1)
bour_surface = pv.ParametricBour()
plotter.add_text("Bour's Surface", font_size=12)
plotter.add_mesh(bour_surface, color="magenta")

# ParametricBoy - 生成 Boy 的曲面,可以通过 zscale 调整高度
plotter.subplot(0, 2)
boy_surface = pv.ParametricBoy(zscale=1.5)
plotter.add_text("Boy's Surface", font_size=12)
plotter.add_mesh(boy_surface, color="green")

# ParametricDini - 生成 Dini 的曲面
plotter.subplot(0, 3)
dini_surface = pv.ParametricDini(a=1.0, b=0.5)
plotter.add_text("Dini's Surface", font_size=12)
plotter.add_mesh(dini_surface, color="red")

# ParametricCatalanMinimal - 生成 Catalan 的最小曲面
plotter.subplot(1, 0)
catalan_surface = pv.ParametricCatalanMinimal()
plotter.add_text("Catalan's Minimal Surface", font_size=12)
plotter.add_mesh(catalan_surface, color="yellow")

# ParametricConicSpiral - 生成类似海螺的圆锥螺旋面
plotter.subplot(1, 1)
conic_spiral = pv.ParametricConicSpiral(a=1.0, b=0.5, c=1.0, n=20)
plotter.add_text("Conic Spiral", font_size=12)
plotter.add_mesh(conic_spiral, color="blue")

# ParametricCrossCap - 生成交叉帽 (一种非定向曲面)
plotter.subplot(1, 2)
cross_cap = pv.ParametricCrossCap()
plotter.add_text("Cross Cap", font_size=12)
plotter.add_mesh(cross_cap, color="orange")

# ParametricEllipsoid - 生成椭球面,支持 x, y, z 三个轴的半径调整
plotter.subplot(1, 3)
ellipsoid = pv.ParametricEllipsoid(xradius=1.0, yradius=1.0, zradius=0.5)
plotter.add_text("Ellipsoid", font_size=12)
plotter.add_mesh(ellipsoid, color="purple")

# ParametricEnneper - 生成 Enneper 曲面
plotter.subplot(2, 0)
enneper_surface = pv.ParametricEnneper()
plotter.add_text("Enneper's Surface", font_size=12)
plotter.add_mesh(enneper_surface, color="pink")

# ParametricFigure8Klein - 生成一个类似数字8形状的克莱因瓶
plotter.subplot(2, 1)
figure8_klein = pv.ParametricFigure8Klein(radius=1.0)
plotter.add_text("Figure-8 Klein", font_size=12)
plotter.add_mesh(figure8_klein, color="grey")

# ParametricHenneberg - 生成 Henneberg 的最小曲面
plotter.subplot(2, 2)
henneberg_surface = pv.ParametricHenneberg()
plotter.add_text("Henneberg's Minimal Surface", font_size=12)
plotter.add_mesh(henneberg_surface, color="brown")

# ParametricKlein - 生成经典的克莱因瓶
plotter.subplot(2, 3)
klein_surface = pv.ParametricKlein()
plotter.add_text("Klein Bottle", font_size=12)
plotter.add_mesh(klein_surface, color="violet")

# ParametricKuen - 生成 Kuens 的曲面
plotter.subplot(3, 0)
kuen_surface = pv.ParametricKuen(deltav0=0.5)
plotter.add_text("Kuen's Surface", font_size=12)
plotter.add_mesh(kuen_surface, color="lightblue")

# ParametricMobius - 生成 Möbius 带
plotter.subplot(3, 1)
mobius_strip = pv.ParametricMobius(radius=1.0)
plotter.add_text("Mobius Strip", font_size=12)
plotter.add_mesh(mobius_strip, color="darkgreen")

# ParametricPluckerConoid - 生成 Plucker 的锥面
plotter.subplot(3, 2)
plucker_conoid = pv.ParametricPluckerConoid(n=1)
plotter.add_text("Plucker's Conoid", font_size=12)
plotter.add_mesh(plucker_conoid, color="darkblue")

# ParametricPseudosphere - 生成假球面
plotter.subplot(3, 3)
pseudosphere = pv.ParametricPseudosphere()
plotter.add_text("Pseudosphere", font_size=12)
plotter.add_mesh(pseudosphere, color="lightgreen")

# ParametricRandomHills - 生成随机丘陵的表面
plotter.subplot(4, 0)
random_hills = pv.ParametricRandomHills(numberofhills=10)
plotter.add_text("Random Hills", font_size=12)
plotter.add_mesh(random_hills, color="lightyellow")

# ParametricRoman - 生成罗马表面(斯坦纳的曲面)
plotter.subplot(4, 1)
roman_surface = pv.ParametricRoman(radius=1.0)
plotter.add_text("Roman Surface", font_size=12)
plotter.add_mesh(roman_surface, color="brown")

# ParametricSuperEllipsoid - 生成超椭球面
plotter.subplot(4, 2)
super_ellipsoid = pv.ParametricSuperEllipsoid(xradius=1.0, yradius=1.0, zradius=0.5)
plotter.add_text("Super Ellipsoid", font_size=12)
plotter.add_mesh(super_ellipsoid, color="pink")

# ParametricSuperToroid - 生成超环面
plotter.subplot(4, 3)
super_toroid = pv.ParametricSuperToroid(ringradius=1.0, crosssectionradius=0.2)
plotter.add_text("Super Toroid", font_size=12)
plotter.add_mesh(super_toroid, color="orange")

# ParametricTorus - 生成环面,指定环半径和截面半径
plotter.subplot(5, 0)
torus = pv.ParametricTorus(ringradius=1.0, crosssectionradius=0.3)
plotter.add_text("Torus", font_size=12)
plotter.add_mesh(torus, color="yellow")

# 展示所有的形状
plotter.show("Parametric Surfaces")

数据模型(Data Model)

术语

似乎很乱!!

  • DataObject:PyVista中所有数据集的 基类,负责提供内存管理、元数据管理和基本的操作接口,所有具体的数据集类型(如PolyData、ImageData等)都继承自DataObject。
  • Data Sets:指的是PyVista中具体的几种数据类型,包括PolyData、StructuredGrid、UnstructuredGrid等,这些数据集包含点、单元格、拓扑等元素,表示不同的数据结构,用于存储几何信息。
  • Point Sets:指的是包含离散点(例如顶点)的数据类型,通常用于表示几何物体的离散位置。PolyData是常见的点集数据集,它包含了点、线和面,可以表示复杂的三维几何形状。
  • Gridded Data:指规则或非规则网格的数据集,包含在一个规则或不规则的网格上的数值。StructuredGrid、RectilinearGrid和ImageData都属于此类,适用于数据在一定范围内均匀或非均匀分布的情况,通常用于表示体积数据或网格计算结果。
  • Composite Datasets:指由多个数据集组成的复合数据类型,允许存储多种不同数据集(如PolyData、ImageData等)并能够将它们组织成层次结构,MultiBlockDataSet是PyVista中常见的复合数据集类型,适用于复杂的多阶段数据分析。

数据集类(Data Sets)

data model

  • ImageData:用于表示规则的数据,如医学图像或科学计算中的体积数据,适合存储像素或体素值。
  • RectilinearGrid:用于规则网格,但每个维度的坐标可以不同,适用于不均匀坐标分布的网格。
  • StructuredGrid:用于规则的网格数据,常用于科学计算,如气象和地质数据。
  • PolyData:用于表示 二维 多边形数据,如点云、线段、面等,适合表示曲面模型。Poly是多边形的意思。
  • UnstructuredGrid:用于表示不规则网格,支持任意类型的单元,适合复杂计算和仿真应用。

以上数据集按复杂度从低到高(1到5)排序。也就是说,每个数据集都可以表示为一个UnstructuredGrid,但UnstructuredGrid类需要最多的内存来存储,因为它必须考虑每个单独的点和单元。另一方面,由于vtkImageData(ImageData)是均匀间隔的,几个整数和浮点数就可以描述其形状,因此它需要最少的内存来存储。

属性(Attributes)

首先,区分点和单元的概念:

  • 点 (Points) 表示位置或坐标,是单独的空间元素。
  • 单元 (Cells) 是由多个点组合而成的几何单元,定义了网格的拓扑结构。

model

而后,引入不同的属性:

  • point_data:包含与数据集中的每个点相关的标量或向量数据,常用于存储点的属性(如温度、速度、密度等),通常用于流场模拟等应用。
  • cell_data:包含与数据集中的每个单元格相关的数据,通常用于存储单元格的属性(如应力、体积、标量场值等),适用于有限元分析或网格基准计算。
  • field_data:存储与整个数据集相关的全局数据,通常用于存储标量值、数组或其他描述全域特性的信息,例如仿真设置、网格大小或模拟时长等。

一个使用 point data的例子:

point data

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pyvista as pv
import numpy as np

# 创建一个简单的立方体网格
mesh = pv.Cube()

# 为点数据 (point_data) 分配一个标量值(例如:温度)
# 通过 `point_data` 属性设置数据,值将应用到每个点上
mesh.point_data["temperature"] = np.linspace(0, 100, mesh.n_points)

# 创建一个 plotter 对象来显示这些数据
plotter = pv.Plotter()

# 可视化点数据 "temperature"
plotter.add_mesh(mesh, scalars="temperature", cmap="coolwarm", show_edges=True)
plotter.add_text("Point Data: Temperature", position="upper_edge", color="black")
plotter.show()

参考

  • https://docs.pyvista.org/api/utilities/geometric
  • https://docs.pyvista.org/api/utilities/parametric
  • https://docs.pyvista.org/user-guide/data_model
  • https://docs.pyvista.org/user-guide/what-is-a-mesh