如何将Polys of vtkPolyData保存到数据库并将它们分配给vtkPoints?

时间:2016-02-16 17:52:35

标签: python c++ vtk

我想将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;
}

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

    <?xml version="1.0"?>
    <VTKFile type="PolyData" version="0.1" byte_order="LittleEndian" compressor="vtkZLibDataCompressor">
      <PolyData>
        <Piece NumberOfPoints="290" NumberOfVerts="0" NumberOfLines="0" NumberOfStrips="0" NumberOfPolys="321">
          <PointData>
          </PointData>
          <CellData>
          </CellData>
          <Points>
            <DataArray type="Float32" Name="Points" NumberOfComponents="3" format="ascii" RangeMin="6796534.9032" RangeMax="6805936.2466">
              1520 1520 93.9992676 1567 1520 93.9992676
              1567 1612 93.9992676 1520 1612 93.9992676
              ...
            </DataArray>
         </Points>
        <Polys>
        <DataArray type="Int32" Name="connectivity" format="ascii" RangeMin="0" RangeMax="29031">
          0 1 2 3 1 4
          5 2 4 6 7 5
          6 8 9 7 8 10
          ...
 </DataArray>
      </Polys>
    </Piece>
  </PolyData>
</VTKFile>

所以我要创建三个表

对象

IdObject idPoints  idPolys 
1        1         1

然后跟随表将idPoints等于1以将其与#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
....

但是我不知道如何存储甚至将多边形分配给这些点。 据我所知,多边形为连接它们的点提供几何图形?

存储多边形的最佳方法是什么,以及如何将它们分配给存储在表格中的vtkPoints?

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

1 个答案:

答案 0 :(得分:1)

我不太清楚你的意思是&#34;将多边形分配给vtkPoints&#34;。 Polys数组表示网格的多边形,每个网格都是一个vtkCell,它基本上只是一组点索引,用于定义这个多边形构成的点和一个npts - 这个单元格构成的点数。所以你通常将点索引分配给多边形,而不是相反。

点索引是存储在.vtu文件中的连接数组中的内容。它还应该伴随着&#34;偏移&#34;数组描述&#34;连接&#34;数组通过定义该数组的偏移量来启动单个单元格。理论上,如果你的网格只由一种类型的多边形(例如只有三角形)组成,则不需要它,但通常不必为真,所以应该有一个类似的数组:

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

给你第一个多边形,点指数为0 1 2,第二个为3 1 4,第三个为5 2 4 6(四边形 - 可能发生......),第四个为7 5 6等。 无论如何,要使用这种安排,您的数据库将如下所示:

#Polys
Id     pointIDList
0      0 1 2 
1      3 1 4
2      5 2 4 6
....

其中在pointIDList中写入的索引实际上指向您的#Points表(假设您将其更改为使用从零开始的索引;))。这是一个合理的安排,虽然我没有看到你在存储vtu文件方面有什么好处......但我想这是你的关注。

如果通过&#34;将多边形分配给vtkPoints&#34;你的意思是你希望每个点都有一个与它相邻的多边形列表(该点用于创建该多边形),我仍然会使用上面描述的#Polys数据库,然后添加aditional table(或列)带有邻接列表的#Points),保持多边形的索引与顶点相邻。您可以通过调用getPointCells(pointID,pointerToTheListToFill)从vtkPolyData获取该列表。