diff --git a/CMakeLists.txt b/CMakeLists.txt index 43ef656eeac22617ca63c077839cdf64da499713..0f2651e5ed8be1515f61c146a95e9d1a934fefb5 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 e8eff3c5ad53f8cb775b9073514f91bdd7102e70..dc343ec6607546069af4c68e72d85457421a8199 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 d985f360735a19056d7daf24b88c25f3cde3947d..51d504acc292df721aecc1562e8f34c21601084d 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 0000000000000000000000000000000000000000..0dbec1b848850d114b84d20867fd7d97725d4224 --- /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 f873fbfe4c2cdad71d5c9947ed59a6238c2c76d9..0000000000000000000000000000000000000000 --- 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