PyVista&VTK Data Model
在VTK
或PyVista
中可视化数据,需要两条信息:数据的几何图形(描述数据在空间中的位置及其值)和拓扑结构cells
(描述数据集中的点如何相互连接)。
在抽象层,有vtkDataObject
,它只是没有几何结构或拓扑结构的数据“点(属性数据)”。其中包含vtkFieldData
的数组。在具体类层是vtkDataSet
,它将几何图形和拓扑添加到vtkDataObject
。
与数据集中的每个点或单元关联的是一个特定值。由于这些值必须在空间中定位和连接,所以它们保存在vtkDataArray
类中,该类只是堆上的内存缓冲区。在PyVista
中,99%的时间我们与vtkDataSet
对象交互,而不是与vtkDataObject
对象交互。PyVista
使用与VTK
相同的数据类型,但为了便于使用,以更具Python
风格的方式构造它们。
如果想了解VTK
如何构造其数据的,参阅Kitware对Python中VTK的介绍,以及Kitware的GitHub站点上的大量代码示例。卡内基梅隆大学Keenan Crane教授的离散微分几何
YouTube系列提供了与VTK中实现的三维建模
相关的数学概念的优秀介绍。这里教授的概念将帮助更好地理解为什么数据集的结构与VTK等库中的结构相同。
在最基本的级别上,所有PyVista
几何体类都继承自Data Sets
类。数据集具有以点 point
、单元cell
或场阵列形式field arrays
描述该几何体的几何体、拓扑和属性。
PyVista
中的几何体Geometry
表示为点points
和单元格cells
。例如,PolyData
中的一个单元格。
我们需要一种方法来描述这些点在空间中的位置,但我们仅限于像上面所做的那样表达值本身(带索引的数组列表)。VTK(以及PyVista)有多个代表不同数据形状的类。最重要的数据集类如下所示:
在这里,上述数据集从最复杂(5)到最不复杂(1)排序。也就是说,每个数据集都可以表示为非结构化网格UnstructuredGrid
,但非结构化网格类需要存储最多的内存,因为它们必须考虑每个单独的点和单元。另一方面,由于vtkImageData(UniformGrid)
的间距是均匀的,因此几个整数和浮点数可以描述形状,因此存储所需的内存量最少。
这是因为在PolyData
或非结构化网格UnstructuredGrid
中,必须明确定义点和单元。在其他数据类型中,例如UniformGrid
,单元(甚至点)被定义为基于网格维度的属性。