如何在 VTKi 中绘制 supertorus 或 toroid 曲面
How to plot supertorus or toroid surface in VTKi
我开始使用 vtki (https://pypi.org/project/vtki) 可视化工具包 (VTK) 的辅助模块 python。可视化我用于快速原型制作的 3D 表面非常容易,但是与 VTK 相比它有一些限制。
我遇到的一个问题是可视化超环形表面,我可以使用 vtk.vtkParametricSuperToroid()
class 使用 VTK 来实现,但我在 vtki 中找不到类似的功能。 vtki 只提供简单的曲面。
我想知道是否有人有一些经验如何使用 vtki 绘制超环形曲面。任何帮助将不胜感激。
我是 PyVista(以前称为 vtki - 我们最近不得不更改名称)的开发人员之一:https://github.com/pyvista/pyvista很高兴看到您一直喜欢这个软件!
此时,vtk.vtkParametricSuperToroid
class 当前未包装在 PyVista 中 - 我在这里创建了一个功能请求:https://github.com/pyvista/pyvista/issues/213
请随意插话并给我们一些关于如何创建和使用 vtk.vtkParametricSuperToroid
对象的示例代码。
我们有几个要求包装所有 VTK classes,这很容易融入这些工作,我们只需要一些帮助来理解所有其他非典型网格类型。
因为 vtkParametricSuperToroid
class 没有包含在 PyVista 中,我找到了另一个解决方案并使用 vista.StructuredGrid
class 来定义超环形曲面。我创建了一个函数 supertorus 并用它用 PyVista 的 vista.add_mesh()
.
绘制超环面
import vista
import numpy as np
def supertorus(yScale, xScale, Height, InternalRadius, Vertical, Horizontal):
# initial range for values used in parametric equation
n = 100
u = np.linspace(-np.pi, np.pi, n)
t = np.linspace(-np.pi, np.pi, n)
u, t = np.meshgrid(u, t)
# a1: Y Scale <0, 2>
a1 = yScale
# a2: X Scale <0, 2>
a2 = xScale
# a3: Height <0, 5>
a3 = Height
# a4: Internal radius <0, 5>
a4 = InternalRadius
# e1: Vertical squareness <0.25, 1>
e1 = Vertical
# e2: Horizontal squareness <0.25, 1>
e2 = Horizontal
# Definition of parametric equation for supertorus
x = a1 * (a4 + np.sign(np.cos(u)) * np.abs(np.cos(u)) ** e1) *\
np.sign(np.cos(t)) * np.abs(np.cos(t)) ** e2
y = a2 * (a4 + np.sign(np.cos(u)) * np.abs(np.cos(u)) ** e1) *\
np.sign(np.sin(t)) * np.abs(np.sin(t)) ** e2
z = a3 * np.sign(np.sin(u)) * np.abs(np.sin(u)) ** e1
grid = vista.StructuredGrid(x, y, z)
return grid
我开始使用 vtki (https://pypi.org/project/vtki) 可视化工具包 (VTK) 的辅助模块 python。可视化我用于快速原型制作的 3D 表面非常容易,但是与 VTK 相比它有一些限制。
我遇到的一个问题是可视化超环形表面,我可以使用 vtk.vtkParametricSuperToroid()
class 使用 VTK 来实现,但我在 vtki 中找不到类似的功能。 vtki 只提供简单的曲面。
我想知道是否有人有一些经验如何使用 vtki 绘制超环形曲面。任何帮助将不胜感激。
我是 PyVista(以前称为 vtki - 我们最近不得不更改名称)的开发人员之一:https://github.com/pyvista/pyvista很高兴看到您一直喜欢这个软件!
此时,vtk.vtkParametricSuperToroid
class 当前未包装在 PyVista 中 - 我在这里创建了一个功能请求:https://github.com/pyvista/pyvista/issues/213
请随意插话并给我们一些关于如何创建和使用 vtk.vtkParametricSuperToroid
对象的示例代码。
我们有几个要求包装所有 VTK classes,这很容易融入这些工作,我们只需要一些帮助来理解所有其他非典型网格类型。
因为 vtkParametricSuperToroid
class 没有包含在 PyVista 中,我找到了另一个解决方案并使用 vista.StructuredGrid
class 来定义超环形曲面。我创建了一个函数 supertorus 并用它用 PyVista 的 vista.add_mesh()
.
import vista
import numpy as np
def supertorus(yScale, xScale, Height, InternalRadius, Vertical, Horizontal):
# initial range for values used in parametric equation
n = 100
u = np.linspace(-np.pi, np.pi, n)
t = np.linspace(-np.pi, np.pi, n)
u, t = np.meshgrid(u, t)
# a1: Y Scale <0, 2>
a1 = yScale
# a2: X Scale <0, 2>
a2 = xScale
# a3: Height <0, 5>
a3 = Height
# a4: Internal radius <0, 5>
a4 = InternalRadius
# e1: Vertical squareness <0.25, 1>
e1 = Vertical
# e2: Horizontal squareness <0.25, 1>
e2 = Horizontal
# Definition of parametric equation for supertorus
x = a1 * (a4 + np.sign(np.cos(u)) * np.abs(np.cos(u)) ** e1) *\
np.sign(np.cos(t)) * np.abs(np.cos(t)) ** e2
y = a2 * (a4 + np.sign(np.cos(u)) * np.abs(np.cos(u)) ** e1) *\
np.sign(np.sin(t)) * np.abs(np.sin(t)) ** e2
z = a3 * np.sign(np.sin(u)) * np.abs(np.sin(u)) ** e1
grid = vista.StructuredGrid(x, y, z)
return grid