c++:如何使用 vtk 库从 vti 网格读取双标量数据?

问题描述 投票:0回答:0

我正在尝试从我的 vti 文件中的网格中读取双精度值。但是,当我尝试访问其中的任何元素时,我从

GetScalarPointer
获得的返回值会生成分段错误,例如与
scalarPtr[0]

#include <vtkSmartPointer.h>
#include <vtkXMLImageDataReader.h>
#include <vtkImageData.h>

int main(){
  vtkSmartPointer<vtkXMLImageDataReader> reader =
      vtkSmartPointer<vtkXMLImageDataReader>::New();
  reader->SetFileName("my_file.vti");
  reader->Update();
  vtkSmartPointer<vtkImageData> imageData =
          vtkSmartPointer<vtkImageData>::New();
  imageData->ShallowCopy(reader->GetOutput());
  double* scalarPtr = static_cast<double*>(imageData->GetScalarPointer());
  std::cout << scalarPtr[0] << std::endl; // segmentation fault
}

我知道类型是 double 因为

imageData->GetDataType()
返回 11,对应于
VTK_DOUBLE
.

我也试过看看是不是因为值的字节顺序,但是

double* scalarPtr = static_cast<double*>(imageData->GetScalarPointer());
const vtkIdType numScalars = imageData->GetNumberOfPoints();
const int scalarSize = sizeof(double);
vtkByteSwap::SwapVoidRange(scalarPtr, numScalars, scalarSize);

也会导致分段错误,可能是因为

scalarPtr
不可访问。

这些是我

vtkImageData
课的内容:

vtkImageData (0x556e1ad5afd0)
  Debug: Off
  Modified Time: 307
  Reference Count: 1
  Registered Events: (none)
  Information: 0x556e1ad5b470
  Data Released: False
  Global Release Data: Off
  UpdateTime: 0
  Field Data:
    Debug: Off
    Modified Time: 307
    Reference Count: 1
    Registered Events: (none)
    Number Of Arrays: 1
    Array 0 name = comments
    Number Of Components: 1
    Number Of Tuples: 1
  Number Of Points: 2431
  Number Of Cells: 1920
  Cell Data:
    Debug: Off
    Modified Time: 302
    Reference Count: 1
    Registered Events:
      Registered Observers:
        vtkObserver (0x556e1ad5cb00)
          Event: 33
          EventName: ModifiedEvent
          Command: 0x556e1ad5c6a0
          Priority: 0
          Tag: 1
    Number Of Arrays: 1
    Array 0 name = material
    Number Of Components: 1
    Number Of Tuples: 1920
    Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
    Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
    Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
    Scalars: (none)
    Vectors: (none)
    Normals: (none)
    TCoords: (none)
    Tensors: (none)
    GlobalIds: (none)
    PedigreeIds: (none)
    EdgeFlag: (none)
    Tangents: (none)
    RationalWeights: (none)
    HigherOrderDegrees: (none)
  Point Data:
    Debug: Off
    Modified Time: 304
    Reference Count: 1
    Registered Events:
      Registered Observers:
        vtkObserver (0x556e1ad5c8e0)
          Event: 33
          EventName: ModifiedEvent
          Command: 0x556e1ad5c6a0
          Priority: 0
          Tag: 1
    Number Of Arrays: 0
    Number Of Components: 0
    Number Of Tuples: 0
    Copy Tuple Flags: ( 1 1 1 1 1 0 1 1 1 1 1 )
    Interpolate Flags: ( 1 1 1 1 1 0 0 1 1 1 1 )
    Pass Through Flags: ( 1 1 1 1 1 1 1 1 1 1 1 )
    Scalars: (none)
    Vectors: (none)
    Normals: (none)
    TCoords: (none)
    Tensors: (none)
    GlobalIds: (none)
    PedigreeIds: (none)
    EdgeFlag: (none)
    Tangents: (none)
    RationalWeights: (none)
    HigherOrderDegrees: (none)
  Bounds:
    Xmin,Xmax: (0, 5e-06)
    Ymin,Ymax: (0, 8e-06)
    Zmin,Zmax: (0, 6e-06)
  Compute Time: 308
  Spacing: (5e-07, 5e-07, 5e-07)
  Origin: (0, 0, 0)
  Direction: (1, 0, 0, 0, 1, 0, 0, 0, 1)
  Dimensions: (11, 17, 13)
  Increments: (0, 0, 0)
  Extent: (0, 10, 0, 16, 0, 12)

就访问网格值的方式而言,我做错了什么?

c++ vtk
© www.soinside.com 2019 - 2024. All rights reserved.