vtu_1は, 非構造格子を読み取り, ポリデータに変換し, 領域の境界を判定する例です.
たとえば元の VTK UnstructuredGrid データが

こうであったとしましょう. これをまあ普通に読み込んで,
#include <iostream>
#include <boost/filesystem.hpp>
//Load VTU file
#include <vtkSmartPointer.h>
#include <vtkNew.h>
#include <vtkUnstructuredGrid.h>
#include <vtkXMLUnstructuredGridReader.h>
...
//Load VTU file
boost::filesystem::path cpwd=getenv("HOME");
cpwd/="CGAL_test";
boost::filesystem::path filename = cpwd/"2dmesh_test.vtu";
vtkNew<vtkXMLUnstructuredGridReader> reader;
reader->SetFileName(filename.c_str());PolyDataに変換するには,
//Convert to PolyData
#include <vtkGeometryFilter.h>
#include <vtkPolyData.h>
...
//Convert to vtkPolyData
// https://kitware.github.io/vtk-examples/site/Cxx/PolyData/GeometryFilter/
auto geometryFilter = vtkSmartPointer<vtkGeometryFilter>::New();
geometryFilter->SetInputConnection(reader->GetOutputPort());PolyDataでは, FeatureEdgeフィルターが使えるので, いろいろ取得できます.たとえば領域の縁をゲットしたい場合
//Extract Boundary
#include <vtkFeatureEdges.h> //in vtkFiltersCore, vtkCommonExecutionModel
...
//Get Boundary of the data
// https://kitware.github.io/vtk-examples/site/Cxx/Meshes/BoundaryEdges/
vtkNew<vtkFeatureEdges> featureEdges;
featureEdges->SetInputConnection(geometryFilter->GetOutputPort());
featureEdges->BoundaryEdgesOn();
featureEdges->FeatureEdgesOff();
featureEdges->ManifoldEdgesOff();
featureEdges->NonManifoldEdgesOff();
featureEdges->ColoringOn();
featureEdges->Update();
vtkPolyData& polydata = *geometryFilter->GetOutput();
vtkPolyData& polydata_B = *featureEdges->GetOutput();物理量を追加することも可能:
//Add function
#include <vtkDoubleArray.h>
#include <vtkCellData.h>
#include <vtkCell.h>
...
//Add function to polydata
vtkDoubleArray& pressure = *vtkDoubleArray::New(); //Create array
pressure.SetNumberOfComponents(0); //It is scalar
pressure.SetName("p"); //Its name
pressure.SetNumberOfTuples(polydata.GetNumberOfCells()); //Its number
polydata.GetCellData()->AddArray(&pressure); //Add it !
//Add sample values
for (int cid = 0; cid < polydata.GetNumberOfCells(); cid++)
{
double p=cid;
pressure.SetValue(cid,p);
}もちろんVTPファイルに保存できる:
//Save VTP file
{
vtkNew<vtkXMLPolyDataWriter> writer;
boost::filesystem::path p_name = cpwd/"2dmesh_p.vtp";
writer->SetFileName(p_name.c_str());
writer->SetInputData(&polydata);
writer->Write();
}
{
vtkNew<vtkXMLPolyDataWriter> writer;
boost::filesystem::path p_name = cpwd/"2dmesh_b.vtp";
writer->SetFileName(p_name.c_str());
writer->SetInputData(&polydata_B);
writer->Write();
}で,こうなる:
