#include <vtkTriangleFilter.h> #include "triangulate.h" vtkSmartPointer<vtkPolyData> triangulate::buildValidTriangulation(vtkSmartPointer<vtkPolyData> polyData) { vtkSmartPointer<vtkPolyData> triPolyData = vtkSmartPointer<vtkPolyData>::New(); // if mesh is composed of quads, builds a valid triangulation if (polyData->GetMaxCellSize() == 4) { // we're using a vtkQuadToTriangle filter to convert quads in triangles vtkSmartPointer<vtkTriangleFilter> quadToTri = vtkSmartPointer<vtkTriangleFilter>::New(); quadToTri->SetInputData(polyData); quadToTri->Update(); triPolyData = quadToTri->GetOutput(); } else if (polyData->GetMaxCellSize() == 3) // if mesh is already triangulated, return origin's vtkPolyData { triPolyData = polyData; } else { std::cout << "This mesh is not handled by this program, allows only triangulated and quadrilated meshes.\n"; std::cout << "Maximum cell size for this mesh: " << polyData->GetMaxCellSize() << ".\n"; exit(0); } // adding a vtkTriangleFilter to ensure that the output is a well triangulated mesh vtkSmartPointer<vtkTriangleFilter> triangleFilter = vtkSmartPointer<vtkTriangleFilter>::New(); triangleFilter->SetInputData(triPolyData); triangleFilter->Update(); return triangleFilter->GetOutput(); }