From ac6fa7a2170892dc969d256fa4b9636f2ad2cbe4 Mon Sep 17 00:00:00 2001 From: Astrid <astrid.beyer@etu.univ-amu.fr> Date: Wed, 26 Apr 2023 14:51:50 +0200 Subject: [PATCH] triangulate becomes operation, detection of open surface mesh --- CMakeLists.txt | 2 +- main.cpp | 9 ++++--- triangulate.cpp => operation_mesh.cpp | 36 ++++++++++++++++++++++++--- operation_mesh.h | 33 ++++++++++++++++++++++++ triangulate.h | 23 ----------------- 5 files changed, 71 insertions(+), 32 deletions(-) rename triangulate.cpp => operation_mesh.cpp (53%) create mode 100644 operation_mesh.h delete mode 100644 triangulate.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 43ef656..0f2651e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD 11) find_package(TTKVTK REQUIRED) -add_executable(projet-stage main.cpp triangulate.cpp vtkOFFReader.cxx) +add_executable(projet-stage main.cpp operation_mesh.cpp vtkOFFReader.cxx) target_link_libraries(projet-stage PUBLIC diff --git a/main.cpp b/main.cpp index e8eff3c..dc343ec 100644 --- a/main.cpp +++ b/main.cpp @@ -55,7 +55,7 @@ #include <vtkAppendPolyData.h> #include <vtkSortDataArray.h> -#include "triangulate.h" +#include "operation_mesh.h" int main(int argc, char *argv[]) { @@ -78,7 +78,8 @@ int main(int argc, char *argv[]) vtkNew<vtkOBJReader> reader; reader->SetFileName(filename.c_str()); reader->Update(); - source = triangulate::buildValidTriangulation(reader->GetOutput()); + source = operation::buildValidTriangulation(reader->GetOutput()); + vtkSmartPointer<vtkPolyData> toto = operation::closeMesh(reader->GetOutput()); } else if (extension == ".off") { @@ -93,7 +94,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (source->GetNumberOfCells() > 90000) // avoid segmentation fault + if (source->GetNumberOfCells() > 100000) // avoid segmentation fault { std::cerr << "Your mesh has too many polygones (" << source->GetNumberOfCells() << ") for this program to run properly.\n"; return EXIT_FAILURE; @@ -121,7 +122,7 @@ int main(int argc, char *argv[]) vtkNew<vtkDoubleArray> shapeIndex; shapeIndex->SetName("Shape_Index"); - for (vtkIdType i = 0; i < k1->GetNumberOfPoints(); ++i) + for (vtkIdType i = 0; i < k2->GetNumberOfPoints(); ++i) { double kmax = k1Array->GetVariantValue(i).ToDouble(); double kmin = k2Array->GetVariantValue(i).ToDouble(); diff --git a/triangulate.cpp b/operation_mesh.cpp similarity index 53% rename from triangulate.cpp rename to operation_mesh.cpp index d985f36..51d504a 100644 --- a/triangulate.cpp +++ b/operation_mesh.cpp @@ -1,7 +1,6 @@ -#include <vtkTriangleFilter.h> -#include "triangulate.h" +#include "operation_mesh.h" -vtkSmartPointer<vtkPolyData> triangulate::buildValidTriangulation(vtkSmartPointer<vtkPolyData> polyData) +vtkSmartPointer<vtkPolyData> operation::buildValidTriangulation(vtkSmartPointer<vtkPolyData> polyData) { vtkSmartPointer<vtkPolyData> triPolyData = vtkSmartPointer<vtkPolyData>::New(); @@ -31,4 +30,33 @@ vtkSmartPointer<vtkPolyData> triangulate::buildValidTriangulation(vtkSmartPointe triangleFilter->Update(); return triangleFilter->GetOutput(); -} \ No newline at end of file +} + +#include <vtkSmartPointer.h> +#include <vtkPolyData.h> +#include <vtkCellArray.h> +#include <vtkIdList.h> +#include <vtkTriangle.h> +#include <vtkTetra.h> +#include <vtkCleanPolyData.h> + +#include <vtkFeatureEdges.h> + +vtkSmartPointer<vtkPolyData> operation::closeMesh(vtkSmartPointer<vtkPolyData> polyData) +{ + // Check if the input mesh is open + vtkSmartPointer<vtkFeatureEdges> featureEdges = vtkSmartPointer<vtkFeatureEdges>::New(); + featureEdges->SetInputData(polyData); + featureEdges->BoundaryEdgesOn(); + featureEdges->NonManifoldEdgesOn(); + featureEdges->FeatureEdgesOff(); + featureEdges->Update(); + vtkSmartPointer<vtkPolyData> output = featureEdges->GetOutput(); + int numOpenEdges = output->GetNumberOfCells(); + + if (numOpenEdges != 0) { + std::cout << "There are " << numOpenEdges << " open edges.\n"; + } else { + std::cout << "There are no open edges.\n"; + } +} diff --git a/operation_mesh.h b/operation_mesh.h new file mode 100644 index 0000000..0dbec1b --- /dev/null +++ b/operation_mesh.h @@ -0,0 +1,33 @@ +/** + * @class operation_mesh + * + * @author Astrid BEYER + * @date 2023 + * @version 1.0 + * + */ + +#ifndef OPERATION_MESH_H +#define OPERATION_MESH_H + +#include <vtkTriangleFilter.h> + + +namespace operation +{ + /** + * @brief buildValidTriangulation : transforms, if necessary, input's polyData so it ensure it's triangulated + * @param polyData + * @returns vtkSmartPointer<vtkPolyData> + */ + vtkSmartPointer<vtkPolyData> buildValidTriangulation(vtkSmartPointer<vtkPolyData> polyData); + /** + * @brief closeMesh : close the surface of the mesh, if necessary + * @param polyData + * @returns vtkSmartPointer<vtkPolyData> + */ + vtkSmartPointer<vtkPolyData> closeMesh(vtkSmartPointer<vtkPolyData> polyData); + +} + +#endif diff --git a/triangulate.h b/triangulate.h deleted file mode 100644 index f873fbf..0000000 --- a/triangulate.h +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @class triangulate - * - * @author Astrid BEYER - * @date 2023 - * @version 1.1 - * - */ - -#ifndef TRIANGULATE_H -#define TRIANGULATE_H - -namespace triangulate -{ - /** - * @brief buildValidTriangulation : transforms, if necessary, input's polyData so it ensure it's triangulated - * @param polyData - * @returns vtkSmartPointer<vtkPolyData> - */ - vtkSmartPointer<vtkPolyData> buildValidTriangulation(vtkSmartPointer<vtkPolyData> polyData); -} - -#endif -- GitLab