mirror of https://github.com/CGAL/cgal
Modifications of C2T3:
- add a lot of comments arround the face status. - use explicit variable names in union find, instead of 'i' and 'j' - add a is_valid() function, that checks that the facets markers are the same from both sides, and that the real number of marked facets is conform to the cached number (used in the Slivers_exuder),
This commit is contained in:
parent
5b9b017c12
commit
00ced538b1
|
|
@ -32,6 +32,7 @@
|
||||||
#include <boost/type_traits/is_same.hpp>
|
#include <boost/type_traits/is_same.hpp>
|
||||||
#include <boost/mpl/if.hpp>
|
#include <boost/mpl/if.hpp>
|
||||||
#include <boost/utility/enable_if.hpp>
|
#include <boost/utility/enable_if.hpp>
|
||||||
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
@ -136,6 +137,20 @@ namespace CGAL {
|
||||||
|
|
||||||
} // end nested-namespace details (in CGAL::)
|
} // end nested-namespace details (in CGAL::)
|
||||||
|
|
||||||
|
namespace Surface_mesher {
|
||||||
|
|
||||||
|
template < class Tr>
|
||||||
|
typename Tr::size_type number_of_facets_on_surface(const Tr& T) {
|
||||||
|
typename Tr::size_type result=0;
|
||||||
|
for (typename Tr::Finite_facets_iterator fit = T.finite_facets_begin();
|
||||||
|
fit != T.finite_facets_end(); ++fit)
|
||||||
|
if (fit->first->is_facet_on_surface (fit->second))
|
||||||
|
++result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end nested-namespace Surface_mesher (in CGAL)
|
||||||
|
|
||||||
template < class Tr, typename Edge_info_ = void >
|
template < class Tr, typename Edge_info_ = void >
|
||||||
class Complex_2_in_triangulation_3 :
|
class Complex_2_in_triangulation_3 :
|
||||||
public details::C2t3_mark_edges_helper_class<Tr, Edge_info_>
|
public details::C2t3_mark_edges_helper_class<Tr, Edge_info_>
|
||||||
|
|
@ -163,7 +178,25 @@ public:
|
||||||
typedef std::map <Pair_of_vertices,
|
typedef std::map <Pair_of_vertices,
|
||||||
std::pair<int, Facets > >
|
std::pair<int, Facets > >
|
||||||
Edge_facet_counter;
|
Edge_facet_counter;
|
||||||
enum Face_status{ NOT_IN_COMPLEX, ISOLATED, BOUNDARY, REGULAR, SINGULAR};
|
enum Face_status{ NOT_IN_COMPLEX = 0,
|
||||||
|
ISOLATED = 1, // - An ISOLATED edge is a marked edge,
|
||||||
|
// without any incident facets.
|
||||||
|
BOUNDARY, // - An edge is on BOUNDARY if it has only
|
||||||
|
// one incident facet.
|
||||||
|
// - A vertex is on BOUNDARY if all its
|
||||||
|
// incident edges are REGULAR or on
|
||||||
|
// BOUNDARY, at least one is on
|
||||||
|
// BOUNDARY, and the incident facets
|
||||||
|
// form only one connected component.
|
||||||
|
REGULAR, // - A facet that is in the complex is
|
||||||
|
// REGULAR.
|
||||||
|
// - An edge is REGULAR if it has
|
||||||
|
// exactly two incident facets.
|
||||||
|
// - A vertex is REGULAR if all it
|
||||||
|
// incident edges are REGULAR, and the
|
||||||
|
// incident facets form only one
|
||||||
|
// connected component.
|
||||||
|
SINGULAR}; // - SINGULAR is for all other cases.
|
||||||
|
|
||||||
class Iterator_not_in_complex {
|
class Iterator_not_in_complex {
|
||||||
Self* self;
|
Self* self;
|
||||||
|
|
@ -356,12 +389,12 @@ public:
|
||||||
|
|
||||||
// from now on incident edges (in complex) are REGULAR or BOUNDARY
|
// from now on incident edges (in complex) are REGULAR or BOUNDARY
|
||||||
|
|
||||||
int i,j;
|
int nb_incident_facets, nb_components;
|
||||||
union_find_of_incident_facets(v,i,j);
|
union_find_of_incident_facets(v, nb_incident_facets, nb_components);
|
||||||
|
|
||||||
if ( i == 0 )
|
if ( nb_incident_facets == 0 )
|
||||||
return NOT_IN_COMPLEX;
|
return NOT_IN_COMPLEX;
|
||||||
else if ( j > 1 )
|
else if ( nb_components > 1 )
|
||||||
return SINGULAR;
|
return SINGULAR;
|
||||||
else // REGULAR OR BOUNDARY
|
else // REGULAR OR BOUNDARY
|
||||||
{
|
{
|
||||||
|
|
@ -701,6 +734,38 @@ public:
|
||||||
Iterator_not_on_boundary(this));
|
Iterator_not_on_boundary(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_valid(bool verbose = false)
|
||||||
|
{
|
||||||
|
const typename Tr::size_type nb = number_of_facets_on_surface(tr);
|
||||||
|
if(number_of_facets() != nb)
|
||||||
|
{
|
||||||
|
if(verbose) {
|
||||||
|
std::cerr << boost::format("C2t3: Invalid number of facet: %1% (should be %2%)!\n")
|
||||||
|
% number_of_facets() % nb;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for(Facet_iterator it = facets_begin(),
|
||||||
|
end = facets_end();
|
||||||
|
it != end; ++it)
|
||||||
|
{
|
||||||
|
CGAL_assertion(it->first->is_facet_on_surface(it->second));
|
||||||
|
const Facet& f = tr.mirror_facet(*it);
|
||||||
|
if(!f.first->is_facet_on_surface(f.second))
|
||||||
|
{
|
||||||
|
if(verbose) {
|
||||||
|
std::cerr <<
|
||||||
|
boost::format("C2t3: facet (%1%, %2%) is marked on surface"
|
||||||
|
"will its mirror facet (%3, %4) is not!\n")
|
||||||
|
% &*it->first % it->second
|
||||||
|
% &*f.first % f.second;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CGAL_MESH_3_IO_H
|
#ifdef CGAL_MESH_3_IO_H
|
||||||
static
|
static
|
||||||
std::string io_signature()
|
std::string io_signature()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue