如何将 vtkPolyData 的 Polys 保存到数据库并将它们分配给 vtkPoints?
How to save Polys of vtkPolyData to a database and assign them to vtkPoints?
我想将 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>
所以我想创建三个 tables
对象
IdObject idPoints idPolys
1 1 1
然后跟随 table 将有等于 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
....
但是我不知道如何存储甚至将多边形分配给这些点。
据我了解,多边形给出了连接它们的点的几何形状,对吗?
存储多边形的最佳方式是什么以及如何将它们分配给存储在 table 中的 vtkPoints?
#Polys
Id ???????
1 0 1 2 3 1 4
5 2 4 6 7 5
6 8 9 7 8 10
....
我不太清楚你说的 "assigning polys to 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,第三个为 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 table(假设您将其更改为使用基于零的索引;))。这是一个合理的安排,虽然我不太明白存储 vtu 文件有什么好处......但我想这是你关心的问题。
如果 "assigning polys to vtkPoints" 你的意思是你希望每个点都有一个与其相邻的多边形列表(那个点用于创建那个多边形),我仍然会使用#Polys如上所述的数据库,然后使用邻接列表添加额外的 table(或#Points 的列),保持多边形的索引与顶点相邻。您可以通过调用 getPointCells(pointID, pointerToTheListToFill).
从 vtkPolyData 获取该列表
我想将 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>
所以我想创建三个 tables
对象
IdObject idPoints idPolys
1 1 1
然后跟随 table 将有等于 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
....
但是我不知道如何存储甚至将多边形分配给这些点。 据我了解,多边形给出了连接它们的点的几何形状,对吗?
存储多边形的最佳方式是什么以及如何将它们分配给存储在 table 中的 vtkPoints?
#Polys
Id ???????
1 0 1 2 3 1 4
5 2 4 6 7 5
6 8 9 7 8 10
....
我不太清楚你说的 "assigning polys to 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,第三个为 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 table(假设您将其更改为使用基于零的索引;))。这是一个合理的安排,虽然我不太明白存储 vtu 文件有什么好处......但我想这是你关心的问题。
如果 "assigning polys to vtkPoints" 你的意思是你希望每个点都有一个与其相邻的多边形列表(那个点用于创建那个多边形),我仍然会使用#Polys如上所述的数据库,然后使用邻接列表添加额外的 table(或#Points 的列),保持多边形的索引与顶点相邻。您可以通过调用 getPointCells(pointID, pointerToTheListToFill).
从 vtkPolyData 获取该列表