From 64f8f4195cbda03cbd10f2bf6f55a3253c66eceb Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Mon, 4 Jan 2016 14:38:53 +0100 Subject: [PATCH] Addition of a test for the self_intersections --- Polyhedron/demo/Polyhedron/MainWindow.cpp | 9 +++++++-- Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp | 12 +++++++++--- Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h | 2 ++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/MainWindow.cpp b/Polyhedron/demo/Polyhedron/MainWindow.cpp index 614cf00fd42..616736bddb0 100644 --- a/Polyhedron/demo/Polyhedron/MainWindow.cpp +++ b/Polyhedron/demo/Polyhedron/MainWindow.cpp @@ -1244,13 +1244,14 @@ void MainWindow::updateInfo() { int null_edges(0), null_facet(0),isolated(0), polys(0), vertices(0), edges(0), facets(0), total_edges(0), holes(0); double min_edge(std::pow(2, sizeof(double))), max_edge(0); double mean(0); - bool all_triangle = true; + bool all_triangle = true, none_self_interset = true; Q_FOREACH(int id, getSelectedSceneItemIndices()) { Scene_polyhedron_item* item = qobject_cast(scene->item(id)); if(item) { all_triangle &= item->triangulated(); + none_self_interset &= item->self_intersected(); polys++; vertices += item->polyhedron()->size_of_vertices(); edges += item->polyhedron()->size_of_halfedges()/2; @@ -1315,7 +1316,11 @@ void MainWindow::updateInfo() { str += QString("Number of holes : %1
").arg(holes); str += QString("Number of null length edges : %1
").arg(null_edges); if(all_triangle) - str += QString("Number of degenerated faces : %1").arg(null_facet); + str += QString("Number of degenerated faces : %1
").arg(null_facet); + if(none_self_interset) + str += QString("No self-intersection"); + else + str += QString("There are self-intersections"); str+="

"; if(isolated > 0) str += QString("
Number of isolated vertices : %1
").arg(isolated); diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp index b22bcedc27d..0d8fa38db09 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -435,8 +436,7 @@ Scene_polyhedron_item::compute_normals_and_vertices(void) const typedef Kernel::Vector_3 Vector; typedef Polyhedron::Facet_iterator Facet_iterator; typedef Polyhedron::Halfedge_around_facet_circulator HF_circulator; - - + self_intersect = CGAL::Polygon_mesh_processing::does_self_intersect(*poly); Facet_iterator f = poly->facets_begin(); @@ -656,7 +656,7 @@ Scene_polyhedron_item::Scene_polyhedron_item() nb_lines = 0; is_triangulated = true; init(); - + self_intersect = false; } Scene_polyhedron_item::Scene_polyhedron_item(Polyhedron* const p) @@ -676,6 +676,7 @@ Scene_polyhedron_item::Scene_polyhedron_item(Polyhedron* const p) is_triangulated = true; init(); invalidate_buffers(); + self_intersect = false; } Scene_polyhedron_item::Scene_polyhedron_item(const Polyhedron& p) @@ -695,6 +696,7 @@ Scene_polyhedron_item::Scene_polyhedron_item(const Polyhedron& p) nb_facets = 0; nb_lines = 0; invalidate_buffers(); + self_intersect = false; } Scene_polyhedron_item::~Scene_polyhedron_item() @@ -791,6 +793,10 @@ Scene_polyhedron_item::toolTip() const str += QString("Median edge length : %1
").arg(mid_edges_length); str += QString("Mean edge length : %1
").arg(mean_edges_length); str += QString("Number of null length edges : %1
").arg(number_of_null_length_edges); + if(self_intersect) + str += QString("Does self-intersect
"); + else + str += QString("Does not self-intersect
"); if(is_triangulated) str += QString("Number of degenerated faces : %1").arg(number_of_degenerated_faces); if (volume!=-std::numeric_limits::infinity()) diff --git a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h index d42c4d15601..16bda349841 100644 --- a/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h +++ b/Polyhedron/demo/Polyhedron/Scene_polyhedron_item.h @@ -68,6 +68,7 @@ public: double getMeanEdgesLength(){return mean_edges_length;} double getMidEdgesLength(){return mid_edges_length;} bool triangulated(){return is_triangulated;} + bool self_intersected(){return !self_intersect;} public Q_SLOTS: virtual void invalidate_buffers(); @@ -147,6 +148,7 @@ private: mutable QOpenGLShaderProgram *program; mutable int number_of_null_length_edges, number_of_degenerated_faces; mutable double min_edges_length, max_edges_length, mean_edges_length, mid_edges_length; + mutable bool self_intersect; using CGAL::Three::Scene_item::initialize_buffers; void initialize_buffers(CGAL::Three::Viewer_interface *viewer = 0) const;