如何将vtkPolyData的多边形保存到数据库并将其分配给vtkPoints?

2024-09-28 21:52:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将vtkPolyData保存到数据库中,以便让我了解如何按照下面的示例(它创建一些点,然后将它们导出到vtp文件)

#include <vtkVersion.h>
#include <vtkCellArray.h>
#include <vtkPoints.h>
#include <vtkXMLPolyDataWriter.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>

int main ( int, char *[] )
{
  // Create 10 points.
  vtkSmartPointer<vtkPoints> points = 
    vtkSmartPointer<vtkPoints>::New();

  for ( unsigned int i = 0; i < 10; ++i )
    {
    points->InsertNextPoint ( i, i, i );
    }

  // Create a polydata object and add the points to it.
  vtkSmartPointer<vtkPolyData> polydata = 
    vtkSmartPointer<vtkPolyData>::New();
  polydata->SetPoints(points);

  // Write the file
  vtkSmartPointer<vtkXMLPolyDataWriter> writer =  
    vtkSmartPointer<vtkXMLPolyDataWriter>::New();
  writer->SetFileName("test.vtp");
#if VTK_MAJOR_VERSION <= 5
  writer->SetInput(polydata);
#else
  writer->SetInputData(polydata);
#endif

  // Optional - set the mode. The default is binary.
  //writer->SetDataModeToBinary();
  //writer->SetDataModeToAscii();

  writer->Write();

  return EXIT_SUCCESS;
}

现在导出我正在处理的数据我意识到,数据以以下方式保存:

^{pr2}$

所以我想创建三个表

对象

IdObject idPoints  idPolys 
1        1         1

然后下表将具有等于1的idPoints将其与#Object table关联

#Points
Id     X    Y    Z 
1      1520 1520 93.9992676 
2      1567 1520 93.9992676
3      1567 1612 93.9992676 
4      1520 1612 93.9992676
....

但是我不知道如何存储甚至分配这些点的多边形。 据我所知,多边形给了连接它们的点一个几何图形,对吗?在

存储poly的最佳方法是什么,以及如何将它们分配给存储在表中的vtkpoint?在

#Polys
Id     ??????? 
1      0 1 2 3 1 4
       5 2 4 6 7 5
       6 8 9 7 8 10
....

Tags: the数据newincludecreatepointswriteint
1条回答
网友
1楼 · 发布于 2024-09-28 21:52:25

我不太清楚你说的“给vtkPoints分配多边形”是什么意思。Polys数组表示网格的多边形,每个多边形都是一个vtkCell,它基本上只是一组点索引,定义这个多边形由哪些点组成,npts—这个单元由多少个点组成。因此,通常将点索引指定给多边形,而不是相反。在

点索引是存储在.vtu文件的连接数组中的内容。它还应该伴随一个“offset”数组,该数组描述“connectivity”数组中从何处开始一个单独的单元,方法是定义到该数组的偏移量。理论上,如果网格仅由一种类型的多边形(例如,仅三角形)构成,则不需要使用该方法,但通常情况下不必为真,因此应该有一个如下数组:

  <DataArray type="Int32" Name="offsets" format="ascii" RangeMin="0" RangeMax="123456">
      3 6 10 13 ...
  </DataArray>

第一个多边形的点索引是0 1 2,第二个是3 1 4,第3个是5 2 4 6(可能会发生四边形…),第4个是7 5 6等等。 无论如何,要使用这种安排,您的数据库将如下所示:

^{pr2}$

其中,pointIDList中写入的索引基本上指向您的#Points表(假设您将其更改为使用从零开始的索引;)。这是一个合理的安排,虽然我不太明白你存储vtu文件有什么好处…但我想这是你关心的问题。在

如果“将多边形指定给vtkPoints”是指您希望每个点都有一个与其相邻的多边形列表(该点用于创建该多边形),则我仍将使用上面描述的多边形数据库,然后添加附加表(或列到#点)和邻接列表,保持多边形的索引相邻顶点。您可以通过调用getPointCells(pointID,pointerToTheListToFill)从vtkPolyData获取该列表。在

相关问题 更多 >