让我们说,我有一个矢量场u,其组件为ux,uy和uz,定义在空间rx,ry和rz的(非结构化)位置。
我想要的是将此矢量字段存储为VTK格式,即使用libvtk中的“vtkwriter”类来启用Paraview可视化。
我认为我得到了正确合并职位的代码,但不知何故我无法弄清楚,如何整合数据:
#include <vtkPoints.h>
#include <vtkPolyDataWriter.h>
#include <vtkSmartPointer.h>
void write_file (double* rx, double* ry, double* rz,
double* ux, double* uy, double* uz,
int n, const char* filename)
{
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New ();
points->SetNumberOfPoints(n);
for (int i = 0; i < n; ++i) {
points->SetPoint(i, rx[i], ry[i], rz[i]);
}
// how to incorporate the vector field u?
vtkSmartPointer<vtkPolyDataWriter> writer =
vtkSmartPointer<vtkPolyDataWriter>::New ();
writer->setFileName (filename);
// how to tell the writer, what to write?
writer->Write ();
}
第一个问题是:一般方法是正确的,即坐标是否用vtkPoints
处理?
在搜索互联网时,我发现很多结果,最终文件应该如何。 我可以手工生成这种格式,但这不是我想要做的。
另一方面,我在某种程度上无法理解VTK的文档。每当我查阅类的文档时,它都会引用其他类的文档,而这些其他类的文档会引用第一个类。
这些例子也是如此。 到目前为止,我还没有找到一个,它解释了如何处理在任意位置定义的向量值数据,而其他例子是如此复杂,以至于我完全被困在这里。
我认为,解决方案以某种方式使用vtkPolyData
,但我无法弄清楚,如何插入数据。
我想,它需要一个vtkDoubleArray
,但到目前为止我还没有找到,如果矢量有价值的话怎么做。
提前致谢。
答案 0 :(得分:2)
好的,我在经过充分的试验和错误后完成了它。
定义矢量场的坐标应为vtkPoints
,感兴趣的数据应为vtkDoubleArray
。
最终vtkPolyData
对象的合并是通过vtkPolyData::GetPointData()->SetVectors(...)
完成的。
最后,需要将单元格类型设置为vtkVertex
:
#include <vtkCellArray.h>
#include <vtkDoubleArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>
#include <vtkSmartPointer.h>
#include <vtkVertex.h>
void VTKWriter::write_file(double* rx, double *ry, double *rz,
double* ux, double *uy, double *uz,
int n, const char* filename)
{
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
points->SetNumberOfPoints(n);
vtkSmartPointer<vtkCellArray> vertices =
vtkSmartPointer<vtkCellArray>::New();
vertices->SetNumberOfCells(n);
for (int i = 0; i < n; ++i) {
points->SetPoint(i, rx[i], ry[i], rz[i]);
vtkSmartPointer<vtkVertex> vertex =
vtkSmartPointer<vtkVertex>::New();
vertex->GetPointIds()->SetId(0, i);
vertices->InsertNextCell(vertex);
}
vtkSmartPointer<vtkDoubleArray> u =
vtkSmartPointer<vtkDoubleArray>::New();
u->SetName("u");
u->SetNumberOfComponents(3);
u->SetNumberOfTuples(n);
for (int i = 0; i < n; ++i) {
u->SetTuple3(i, ux[i], uy[i], uz[i]);
}
vtkSmartPointer<vtkPolyData> polydata =
vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
polydata->SetVerts(vertices);
polydata->GetPointData()->SetVectors(u);
vtkSmartPointer<vtkPolyDataWriter> writer =
vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetFileName(filename);
writer->SetInputData(polydata);
writer->Write ();
}
原因,为什么我最初没有得到这个,因为当一个人不熟悉VTK时,点,单元格,顶点,点数据和多边形数据之间的相互作用不容易掌握,教程并没有真正涵盖这个在这一点上,VTK的Doxygen文档在某种程度上也是无用的。