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;