如何使用VTK来存储一个向量场?C++,VTKWriter

3
假设我有一个矢量场u,由在空间中的位置rx、ry和rz定义的分量ux、uy和uz组成(无序)。
我想要的是将这个矢量场与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,但到目前为止,我还没有找到如何将其制作成矢量值的方法。
提前致谢。
1个回答

5

好的,在经过足够的试错后,我已经完成了它。 定义向量场的坐标应为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文档在这一点上也有些无用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接