念のために言っておきますが、原因は実際にvtkDoubleArray
は間違った方法でデータを に書き込んでいたことです。配列には 3 つのコンポーネントがあり、インデックスは本来あるべきものの 1/3 であり、x/y/z 値が点在していました (つまり、私が気付いたように、下3分の3の3x3パターン); コンポーネントが連続して格納されていると想定していましたが、明らかにそうではありません。
古いコードは次のようなものでした。
auto flow=vtkSmartPointer<vtkDoubleArray>::New();
flow->SetNumberOfComponents(3);
auto grid=vtkSmartPointer<vtkUniformGrid>::New();
grid->SetDimensions(...);
grid->GetPointData()->AddArray(flow);
for(int i:{0,1,2}) flow->FillComponent(i,0);
for(ijk: ... /* traverses the grid, each point potentially more than once */ ){
vtkIdType dataId=grid->ComputePointId(ijk);
// XXX: this is what caused troubles:
double* f0=flow->GetPointer(dataId);
f[0]+=dx;
f[1]+=dy;
f[2]+=dz;
}
ループ本体の正しいバージョンは次のとおりです。
double f[3];
flow->GetTupleValue(dataId,f); // copy the data
f[0]+=dx;
f[1]+=dy;
f[2]+=dz;
flow->SetTupleValue(dataId,f);
スカラー データセットとベクトル データセットの両方が一致するようになりました。
