如何存储与VTK矢量场?c++, VTKWriter

How to store a vector field with VTK? C++, VTKWriter

本文关键字:c++ VTKWriter VTK 何存储 存储      更新时间:2023-10-16

假设我有一个向量场u,有分量ux, y和uz,定义在空间rx, ry和rz的(非结构化)位置。

所有我想要的,是存储这个矢量字段与VTK格式,即与类"vtkwriter"从libvtk启用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,但我还没有发现到目前为止,如何使它的向量值。

好了,我经过反复试验才完成了。定义向量场的坐标应该是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 ();
}

的原因,为什么我没有得到这个首先是,因为点,单元格,顶点,点数据和polydata之间的相互作用是不容易掌握,当一个人是新的VTK,教程并没有真正涵盖这一点,和VTK的氧文档在这一点上也是无用的。