2013-02-19 20 views
5

Tôi đang cố gắng ghi dữ liệu từ lưới đồng nhất sang tệp XML vtk, để tôi có thể hiển thị nó bằng Paraview. Tôi muốn tập tin đầu ra của tôi chứa hai biến: một vector 3 thành phần và một giá trị vô hướng ở mọi điểm. Tôi đã quản lý để viết tệp .vti, chỉ chứa các vectơ, như vậy:C++ vtk xml writer (vtkImageData) - nhiều biến trong cùng một tập tin vti

#include <vtkVersion.h> 
#include <vtkSmartPointer.h> 
#include <vtkXMLImageDataWriter.h> 
#include <vtkImageData.h>  

int main() 
{ 
    int nx = 10, ny = 10, nz = 10; 

    vtkSmartPointer<vtkImageData> imageData = 
     vtkSmartPointer<vtkImageData>::New(); 
    imageData->SetDimensions(nx, ny, nz); 

#if VTK_MAJOR_VERSION <= 5 
    imageData->SetNumberOfScalarComponents(3); 
    imageData->SetScalarTypeToDouble(); 
#else 
    imageData->AllocateScalars(VTK_DOUBLE, 3); 
#endif 

    for (int k = 0; k < nz; ++k) { 
     for (int j = 0; j < ny; ++j) { 
      for (int i = 0; i < nx; ++i) { 
       double * voxel = static_cast<double*>(imageData->GetScalarPointer(i,j,k)); 
       int coord = i + j * nx + k * nx * ny; 
       double t = 0.0; 
       double p = 1.0; 
       voxel[0] = sin(t) * cos(p); 
       voxel[1] = sin(t) * sin(p); 
       voxel[2] = cos(t); 
      } 
     } 
    } 

    vtkSmartPointer<vtkXMLImageDataWriter> writer = 
     vtkSmartPointer<vtkXMLImageDataWriter>::New(); 

    writer->SetFileName("test.vti"); 
#if VTK_MAJOR_VERSION <= 5 
    writer->SetInputConnection(imageData->GetProducerPort()); 
#else 
    writer->SetInputData(imageData); 
#endif 
    writer->Write(); 

    return EXIT_SUCCESS; 
} 

Làm cách nào để thêm giá trị vô hướng bổ sung vào mọi điểm trên lưới?

Trả lời

5

tôi làm việc ra làm thế nào để làm điều này bản thân mình, dựa trên mã python trong câu trả lời này:

https://stackoverflow.com/a/7667417/2088135

Trong trường hợp bất cứ ai quan tâm đến việc làm thế nào để làm điều tương tự, đây là "dịch" mã .

#include <vtkVersion.h> 
#include <vtkSmartPointer.h> 
#include <vtkXMLImageDataWriter.h> 
#include <vtkImageData.h> 
#include <vtkPointData.h> 
#include <vtkDoubleArray.h> 

int main() 
{ 
    int nx = 10, ny = 10, nz = 10; 

    vtkSmartPointer<vtkImageData> imageData = 
      vtkSmartPointer<vtkImageData>::New(); 

    imageData->SetDimensions(nx, ny, nz); 

    vtkSmartPointer<vtkDoubleArray> director = 
      vtkSmartPointer<vtkDoubleArray>::New(); 

    director->SetNumberOfComponents(3); 
    director->SetNumberOfTuples(nx * ny * nz); 

    vtkSmartPointer<vtkDoubleArray> energy = 
      vtkSmartPointer<vtkDoubleArray>::New(); 

    energy->SetNumberOfComponents(1); 
    energy->SetNumberOfTuples(nx * ny * nz); 

    for (int i = 0; i < director->GetNumberOfTuples(); ++i) { 
     double t = 1.0; 
     double p = 0.0; 
     double e = 5.0; 
     double x = sin(t) * cos(p), 
       y = sin(t) * sin(p), 
       z = cos(t); 

     director->SetTuple3(i, x, y, z); 
     energy->SetValue(i, e); 
    } 

    imageData->GetPointData()->AddArray(director); 
    director->SetName("Director"); 

    imageData->GetPointData()->AddArray(energy); 
    energy->SetName("Energy"); 

    vtkSmartPointer<vtkXMLImageDataWriter> writer = 
      vtkSmartPointer<vtkXMLImageDataWriter>::New(); 

    writer->SetFileName("test.vti"); 
#if VTK_MAJOR_VERSION <= 5 
    writer->SetInputConnection(imageData->GetProducerPort()); 
#else 
    writer->SetInputData(imageData); 
#endif 
    writer->Write(); 

    return EXIT_SUCCESS; 
} 
Các vấn đề liên quan