mirror of https://github.com/CGAL/cgal
cleanup of the helper files, and a partial fix of the slicer (which will be red in the testsuite)
This commit is contained in:
parent
3a940e4fb5
commit
144d206a75
|
|
@ -1,187 +0,0 @@
|
||||||
// Copyright (c) 2012 GeometryFactory (France). All rights reserved.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Licensees holding a valid commercial license may use this file in
|
|
||||||
// accordance with the commercial license agreement provided with the software.
|
|
||||||
//
|
|
||||||
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU Lesser General Public License as
|
|
||||||
// published by the Free Software Foundation; version 2.1 of the License.
|
|
||||||
// See the file LICENSE.LGPL distributed with CGAL.
|
|
||||||
//
|
|
||||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
||||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
//
|
|
||||||
// $URL$
|
|
||||||
// $Id$
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Author(s) : Philipp Moeller
|
|
||||||
|
|
||||||
#ifndef CGAL_FREE_ITERATOR_FROM_CIRCULATOR_H
|
|
||||||
#define CGAL_FREE_ITERATOR_FROM_CIRCULATOR_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
#include <CGAL/circulator.h>
|
|
||||||
|
|
||||||
#include <boost/operators.hpp>
|
|
||||||
#include <boost/concept_check.hpp>
|
|
||||||
|
|
||||||
#include <boost/mpl/if.hpp>
|
|
||||||
#include <boost/utility/enable_if.hpp>
|
|
||||||
|
|
||||||
namespace CGAL {
|
|
||||||
|
|
||||||
// adapted from circulator.h, does not support
|
|
||||||
// random_access_circulators and returns the underlying circulator
|
|
||||||
// instead of dereferencing it
|
|
||||||
template <class C, bool Prevent_deref = true>
|
|
||||||
class Free_iterator_from_circulator {
|
|
||||||
private:
|
|
||||||
// The m_anchor is normalized to be a minimal circulator.
|
|
||||||
C m_anchor;
|
|
||||||
C current;
|
|
||||||
int m_winding;
|
|
||||||
|
|
||||||
typedef std::iterator_traits<C> I_traits;
|
|
||||||
typedef typename I_traits::iterator_category I_Iter_cat;
|
|
||||||
typedef I_Iterator_from_circulator_traits<I_Iter_cat> I__traits;
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef C Circulator;
|
|
||||||
typedef Free_iterator_from_circulator<C, Prevent_deref> Self;
|
|
||||||
|
|
||||||
typedef typename I__traits::iterator_category iterator_category;
|
|
||||||
|
|
||||||
typedef typename
|
|
||||||
boost::mpl::if_c< Prevent_deref
|
|
||||||
, C
|
|
||||||
, typename C::value_type
|
|
||||||
>::type value_type;
|
|
||||||
|
|
||||||
typedef typename C::difference_type difference_type;
|
|
||||||
typedef typename
|
|
||||||
boost::mpl::if_c< Prevent_deref
|
|
||||||
, C&
|
|
||||||
, typename C::reference
|
|
||||||
>::type reference;
|
|
||||||
typedef typename
|
|
||||||
boost::mpl::if_c< Prevent_deref
|
|
||||||
, C*
|
|
||||||
, typename C::reference
|
|
||||||
>::type pointer;
|
|
||||||
|
|
||||||
Free_iterator_from_circulator(){}
|
|
||||||
|
|
||||||
Free_iterator_from_circulator(const C circ, int n)
|
|
||||||
: m_anchor(circ), current(circ), m_winding(n) {}
|
|
||||||
|
|
||||||
bool operator==( const Self& i) const {
|
|
||||||
CGAL_assertion( m_anchor == i.m_anchor); // same anchor?
|
|
||||||
return ( current == i.current) && ( m_winding == i.m_winding);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=( const Self& i) const {
|
|
||||||
return !(*this == i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// we cannot enable_if on operator* and operator-> because they do not
|
|
||||||
// depend on template parameters directly and default template
|
|
||||||
// arguments for functions are C++11. we redirect on helper member
|
|
||||||
// templates as a work-around.
|
|
||||||
private:
|
|
||||||
template <bool Prevent_deref_>
|
|
||||||
typename boost::enable_if_c<Prevent_deref_, reference>::type
|
|
||||||
indirection() const {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
return const_cast<Self*>(this)->current;
|
|
||||||
}
|
|
||||||
template <bool Prevent_deref_>
|
|
||||||
typename boost::disable_if_c<Prevent_deref_, reference>::type
|
|
||||||
indirection() const {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
return *current;
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
reference operator*() const {
|
|
||||||
return indirection<Prevent_deref>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
template <bool Prevent_deref_>
|
|
||||||
typename boost::disable_if_c<Prevent_deref_, pointer>::type
|
|
||||||
structure_dereference() {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
return &(*current);
|
|
||||||
}
|
|
||||||
template <bool Prevent_deref_>
|
|
||||||
typename boost::enable_if_c<Prevent_deref_, pointer>::type
|
|
||||||
structure_dereference() {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
return ¤t;
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
pointer operator->() const {
|
|
||||||
return structure_dereference<Prevent_deref>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Self& operator++() {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
++current;
|
|
||||||
if ( current == m_anchor)
|
|
||||||
++m_winding;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
Self operator++(int) {
|
|
||||||
Self tmp = *this;
|
|
||||||
++*this;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
Self& operator--() {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
if ( current == m_anchor)
|
|
||||||
--m_winding;
|
|
||||||
--current;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
Self operator--(int) {
|
|
||||||
Self tmp = *this;
|
|
||||||
--*this;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
Self& operator+=( difference_type n) {
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
if ( n < 0 && current == m_anchor) // We are leaving the anchor.
|
|
||||||
--m_winding;
|
|
||||||
current += n;
|
|
||||||
if ( n > 0 && current == m_anchor) // Back again at the anchor.
|
|
||||||
++m_winding;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<( const Self& i) const {
|
|
||||||
CGAL_assertion( m_anchor != NULL);
|
|
||||||
CGAL_assertion( current != NULL);
|
|
||||||
CGAL_assertion( m_anchor == i.m_anchor);
|
|
||||||
return ( (m_winding < i.m_winding)
|
|
||||||
|| ( (m_winding == i.m_winding)
|
|
||||||
&& (current - m_anchor) < (i.current - m_anchor)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
bool operator> ( const Self& i) const { return i < *this; }
|
|
||||||
bool operator<=( const Self& i) const { return !(i < *this); }
|
|
||||||
bool operator>=( const Self& i) const { return !(*this < i); }
|
|
||||||
|
|
||||||
const C* anchor() const { return m_anchor;}
|
|
||||||
int winding() const { return m_winding;}
|
|
||||||
Circulator current_circulator() const { return current;}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // CGAL
|
|
||||||
|
|
||||||
#endif /* CGAL_FREE_ITERATOR_FROM_CIRCULATOR_H */
|
|
||||||
|
|
@ -26,7 +26,8 @@
|
||||||
#include <boost/graph/graph_traits.hpp>
|
#include <boost/graph/graph_traits.hpp>
|
||||||
|
|
||||||
#include <CGAL/assertions.h>
|
#include <CGAL/assertions.h>
|
||||||
#include <CGAL/BGL/Helper.h>
|
#include <CGAL/boost/graph/helpers.h>
|
||||||
|
#include <CGAL/boost/graph/internal/helpers.h>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
@ -51,10 +52,10 @@ join_face(typename boost::graph_traits<Graph>::halfedge_descriptor h,
|
||||||
|
|
||||||
internal::remove_tip(gprev, g);
|
internal::remove_tip(gprev, g);
|
||||||
|
|
||||||
if(! internal::is_border(hop,g)){
|
if(! is_border(hop,g)){
|
||||||
remove_face(f2, g);
|
remove_face(f2, g);
|
||||||
}
|
}
|
||||||
bool fnull = internal::is_border(h,g);
|
bool fnull = is_border(h,g);
|
||||||
|
|
||||||
|
|
||||||
halfedge_descriptor hprev2 = hprev;
|
halfedge_descriptor hprev2 = hprev;
|
||||||
|
|
@ -322,10 +323,10 @@ join_loop(typename boost::graph_traits<Graph>::halfedge_descriptor h1,
|
||||||
typedef typename Traits::halfedge_descriptor halfedge_descriptor;
|
typedef typename Traits::halfedge_descriptor halfedge_descriptor;
|
||||||
typedef typename Traits::face_descriptor face_descriptor;
|
typedef typename Traits::face_descriptor face_descriptor;
|
||||||
|
|
||||||
CGAL_precondition( internal::is_border(h1,g) || face(h1, g) != face(h2, g));
|
CGAL_precondition( is_border(h1,g) || face(h1, g) != face(h2, g));
|
||||||
if (! internal::is_border(h1,g))
|
if (! is_border(h1,g))
|
||||||
remove_face(face(h1, g), g);
|
remove_face(face(h1, g), g);
|
||||||
if (! internal::is_border(h2,g))
|
if (! is_border(h2,g))
|
||||||
remove_face(face(h2,g), g);
|
remove_face(face(h2,g), g);
|
||||||
halfedge_descriptor hi = h1;
|
halfedge_descriptor hi = h1;
|
||||||
halfedge_descriptor gi = h2;
|
halfedge_descriptor gi = h2;
|
||||||
|
|
@ -497,15 +498,15 @@ void remove_face(typename boost::graph_traits<Graph>::halfedge_descriptor h,
|
||||||
typedef typename Traits::halfedge_descriptor halfedge_descriptor;
|
typedef typename Traits::halfedge_descriptor halfedge_descriptor;
|
||||||
typedef typename Traits::face_descriptor face_descriptor;
|
typedef typename Traits::face_descriptor face_descriptor;
|
||||||
|
|
||||||
CGAL_precondition(! internal::is_border(h,g));
|
CGAL_precondition(! is_border(h,g));
|
||||||
face_descriptor f = face(h, g);
|
face_descriptor f = face(h, g);
|
||||||
|
|
||||||
halfedge_descriptor end = h;
|
halfedge_descriptor end = h;
|
||||||
do {
|
do {
|
||||||
internal::set_border(h,g);
|
internal::set_border(h,g);
|
||||||
halfedge_descriptor nh = next(h, g);
|
halfedge_descriptor nh = next(h, g);
|
||||||
bool h_border = internal::is_border(opposite(h, g),g);
|
bool h_border = is_border(opposite(h, g),g);
|
||||||
bool nh_bborder = internal::is_border(opposite(nh, g),g);
|
bool nh_bborder = is_border(opposite(nh, g),g);
|
||||||
|
|
||||||
if(h_border && nh_bborder && next(opposite(nh, g), g) == opposite(h, g)) {
|
if(h_border && nh_bborder && next(opposite(nh, g), g) == opposite(h, g)) {
|
||||||
remove_vertex(target(h, g), g);
|
remove_vertex(target(h, g), g);
|
||||||
|
|
@ -528,7 +529,7 @@ void remove_face(typename boost::graph_traits<Graph>::halfedge_descriptor h,
|
||||||
h = nh;
|
h = nh;
|
||||||
} while(h != end);
|
} while(h != end);
|
||||||
remove_face(f, g);
|
remove_face(f, g);
|
||||||
if(internal::is_border(opposite(h, g),g))
|
if(is_border(opposite(h, g),g))
|
||||||
remove_edge(edge(h, g), g);
|
remove_edge(edge(h, g), g);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -547,13 +548,13 @@ void make_hole(typename boost::graph_traits<Graph>::halfedge_descriptor h,
|
||||||
typedef typename Traits::face_descriptor face_descriptor;
|
typedef typename Traits::face_descriptor face_descriptor;
|
||||||
typedef Halfedge_around_face_iterator<Graph> halfedge_around_face_iterator;
|
typedef Halfedge_around_face_iterator<Graph> halfedge_around_face_iterator;
|
||||||
|
|
||||||
CGAL_precondition(! internal::is_border(h,g));
|
CGAL_precondition(! is_border(h,g));
|
||||||
face_descriptor fd = face(h, g);
|
face_descriptor fd = face(h, g);
|
||||||
halfedge_around_face_iterator hafib, hafie;
|
halfedge_around_face_iterator hafib, hafie;
|
||||||
for(boost::tie(hafib, hafie) = halfedges_around_face(h, g);
|
for(boost::tie(hafib, hafie) = halfedges_around_face(h, g);
|
||||||
hafib != hafie;
|
hafib != hafie;
|
||||||
++hafib){
|
++hafib){
|
||||||
CGAL_assertion(! internal::is_border(opposite(*hafib,g),g));
|
CGAL_assertion(! is_border(opposite(*hafib,g),g));
|
||||||
internal::set_border(*hafib, g);
|
internal::set_border(*hafib, g);
|
||||||
}
|
}
|
||||||
remove_face(fd,g);
|
remove_face(fd,g);
|
||||||
|
|
@ -718,8 +719,8 @@ add_face_to_border(typename boost::graph_traits<Graph>::halfedge_descriptor h1,
|
||||||
typename boost::graph_traits<Graph>::halfedge_descriptor h2,
|
typename boost::graph_traits<Graph>::halfedge_descriptor h2,
|
||||||
Graph& g)
|
Graph& g)
|
||||||
{
|
{
|
||||||
CGAL_precondition(internal::is_border(h1,g) == true);
|
CGAL_precondition(is_border(h1,g) == true);
|
||||||
CGAL_precondition(internal::is_border(h2,g) == true);
|
CGAL_precondition(is_border(h2,g) == true);
|
||||||
CGAL_precondition(h1 != h2);
|
CGAL_precondition(h1 != h2);
|
||||||
CGAL_precondition(next(h1, g) != h2);
|
CGAL_precondition(next(h1, g) != h2);
|
||||||
|
|
||||||
|
|
@ -800,10 +801,10 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
halfedge_descriptor pt = opposite(prev(pq, g), g);
|
halfedge_descriptor pt = opposite(prev(pq, g), g);
|
||||||
halfedge_descriptor qb = opposite(prev(qp, g), g);
|
halfedge_descriptor qb = opposite(prev(qp, g), g);
|
||||||
|
|
||||||
bool lTopFaceExists = ! internal::is_border(pq,g);
|
bool lTopFaceExists = ! is_border(pq,g);
|
||||||
bool lBottomFaceExists = ! internal::is_border(qp,g);
|
bool lBottomFaceExists = ! is_border(qp,g);
|
||||||
bool lTopLeftFaceExists = lTopFaceExists && ! internal::is_border(pt,g);
|
bool lTopLeftFaceExists = lTopFaceExists && ! is_border(pt,g);
|
||||||
bool lBottomRightFaceExists = lBottomFaceExists && ! internal::is_border(qb,g);
|
bool lBottomRightFaceExists = lBottomFaceExists && ! is_border(qb,g);
|
||||||
|
|
||||||
CGAL_precondition( !lTopFaceExists || (lTopFaceExists && ( degree(target(pt, g), g) > 2 ) ) ) ;
|
CGAL_precondition( !lTopFaceExists || (lTopFaceExists && ( degree(target(pt, g), g) > 2 ) ) ) ;
|
||||||
CGAL_precondition( !lBottomFaceExists || (lBottomFaceExists && ( degree(target(qb, g), g) > 2 ) ) ) ;
|
CGAL_precondition( !lBottomFaceExists || (lBottomFaceExists && ( degree(target(qb, g), g) > 2 ) ) ) ;
|
||||||
|
|
@ -858,7 +859,7 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
|
|
||||||
if ( lTopFaceExists )
|
if ( lTopFaceExists )
|
||||||
{
|
{
|
||||||
CGAL_precondition( ! internal::is_border(opposite(pt, g),g) ) ; // p-q-t is a face of the mesh
|
CGAL_precondition( ! is_border(opposite(pt, g),g) ) ; // p-q-t is a face of the mesh
|
||||||
if ( lTopLeftFaceExists )
|
if ( lTopLeftFaceExists )
|
||||||
{
|
{
|
||||||
//CGAL_ECMS_TRACE(3, "Removing p-t E" << pt.idx() << " (V"
|
//CGAL_ECMS_TRACE(3, "Removing p-t E" << pt.idx() << " (V"
|
||||||
|
|
@ -885,7 +886,7 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
|
|
||||||
if ( lBottomFaceExists )
|
if ( lBottomFaceExists )
|
||||||
{
|
{
|
||||||
CGAL_precondition( ! internal::is_border(opposite(qb, g),g) ) ; // p-q-b is a face of the mesh
|
CGAL_precondition( ! is_border(opposite(qb, g),g) ) ; // p-q-b is a face of the mesh
|
||||||
if ( lBottomRightFaceExists )
|
if ( lBottomRightFaceExists )
|
||||||
{
|
{
|
||||||
//CGAL_ECMS_TRACE(3, "Removing q-b E" << qb.idx() << " (V"
|
//CGAL_ECMS_TRACE(3, "Removing q-b E" << qb.idx() << " (V"
|
||||||
|
|
@ -946,8 +947,8 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
halfedge_descriptor tq = opposite(next(pq,g),g);
|
halfedge_descriptor tq = opposite(next(pq,g),g);
|
||||||
halfedge_descriptor bp = opposite(next(qp,g),g);
|
halfedge_descriptor bp = opposite(next(qp,g),g);
|
||||||
|
|
||||||
bool lTopFaceExists = ! internal::is_border(pq,g) ;
|
bool lTopFaceExists = ! is_border(pq,g) ;
|
||||||
bool lBottomFaceExists = ! internal::is_border(qp,g) ;
|
bool lBottomFaceExists = ! is_border(qp,g) ;
|
||||||
|
|
||||||
vertex_descriptor q = target(pq,g);
|
vertex_descriptor q = target(pq,g);
|
||||||
vertex_descriptor p = source(pq,g);
|
vertex_descriptor p = source(pq,g);
|
||||||
|
|
@ -986,7 +987,7 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
if (lTopFaceExists && lBottomFaceExists)
|
if (lTopFaceExists && lBottomFaceExists)
|
||||||
{
|
{
|
||||||
if ( face(edges_to_erase[0],g) == face(edges_to_erase[1],g)
|
if ( face(edges_to_erase[0],g) == face(edges_to_erase[1],g)
|
||||||
&& (! internal::is_border(edges_to_erase[0],g)) )
|
&& (! is_border(edges_to_erase[0],g)) )
|
||||||
{
|
{
|
||||||
// the vertex is of valence 3 and we simply need to remove the vertex
|
// the vertex is of valence 3 and we simply need to remove the vertex
|
||||||
// and its indicent edges
|
// and its indicent edges
|
||||||
|
|
@ -1001,11 +1002,11 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(internal::is_border(edges_to_erase[0],g)))
|
if (!(is_border(edges_to_erase[0],g)))
|
||||||
join_face(edges_to_erase[0],g);
|
join_face(edges_to_erase[0],g);
|
||||||
else
|
else
|
||||||
remove_face(opposite(edges_to_erase[0],g),g);
|
remove_face(opposite(edges_to_erase[0],g),g);
|
||||||
if (!internal::is_border(edges_to_erase[1],g))
|
if (!is_border(edges_to_erase[1],g))
|
||||||
join_face(edges_to_erase[1],g);
|
join_face(edges_to_erase[1],g);
|
||||||
else
|
else
|
||||||
remove_face(opposite(edges_to_erase[1],g),g);
|
remove_face(opposite(edges_to_erase[1],g),g);
|
||||||
|
|
@ -1017,22 +1018,22 @@ collapse_edge(typename boost::graph_traits<Graph>::edge_descriptor v0v1,
|
||||||
{
|
{
|
||||||
if (lTopFaceExists)
|
if (lTopFaceExists)
|
||||||
{
|
{
|
||||||
if (!(internal::is_border(edges_to_erase[0],g))){
|
if (!(is_border(edges_to_erase[0],g))){
|
||||||
join_face(edges_to_erase[0],g);
|
join_face(edges_to_erase[0],g);
|
||||||
join_vertex(pq,g);
|
join_vertex(pq,g);
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
bool lQ_Erased = internal::is_border(opposite(next(pq,g),g),g);
|
bool lQ_Erased = is_border(opposite(next(pq,g),g),g);
|
||||||
remove_face(opposite(edges_to_erase[0],g),g);
|
remove_face(opposite(edges_to_erase[0],g),g);
|
||||||
return lQ_Erased?p:q;
|
return lQ_Erased?p:q;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! (internal::is_border(edges_to_erase[0],g))){
|
if (! (is_border(edges_to_erase[0],g))){
|
||||||
join_face(edges_to_erase[0],g);
|
join_face(edges_to_erase[0],g);
|
||||||
join_vertex(qp,g);
|
join_vertex(qp,g);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
bool lP_Erased= internal::is_border(opposite(next(qp,g),g),g);
|
bool lP_Erased= is_border(opposite(next(qp,g),g),g);
|
||||||
remove_face(opposite(edges_to_erase[0],g),g);
|
remove_face(opposite(edges_to_erase[0],g),g);
|
||||||
return lP_Erased?q:p;
|
return lP_Erased?q:p;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -205,25 +205,7 @@ triangle(const HalfedgeGraph& g,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if all faces in a \ref FaceListGraph are triangles.
|
|
||||||
*
|
|
||||||
* @tparam FaceListGraph Must be a model of \ref FaceListGraph.
|
|
||||||
*
|
|
||||||
* @return true, if all faces are triangles, false otherwise.
|
|
||||||
*/
|
|
||||||
template<typename FaceListGraph>
|
|
||||||
bool
|
|
||||||
is_pure_triangle(const FaceListGraph& g)
|
|
||||||
{
|
|
||||||
typedef boost::graph_traits<FaceListGraph> Traits;
|
|
||||||
typedef typename Traits::face_iterator face_iterator;
|
|
||||||
face_iterator fb, fe;
|
|
||||||
for(boost::tie(fb, fe) = faces(g); fb != fe; ++fb) {
|
|
||||||
if(boost::distance(halfedges_around_face(halfedge(*fb,g), g)) != 3) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
#include <boost/iterator/transform_iterator.hpp>
|
#include <boost/iterator/transform_iterator.hpp>
|
||||||
|
|
||||||
#include <CGAL/boost/graph/properties_PolyMesh_ArrayKernelT.h>
|
#include <CGAL/boost/graph/properties_PolyMesh_ArrayKernelT.h>
|
||||||
#include <CGAL/BGL/OM_iterator_from_circulator.h>
|
#include <CGAL/boost/graph/internal/OM_iterator_from_circulator.h>
|
||||||
#include <CGAL/boost/graph/iterator.h>
|
#include <CGAL/boost/graph/iterator.h>
|
||||||
|
|
||||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||||
|
|
|
||||||
|
|
@ -7,15 +7,12 @@
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
todo: cleanup as this also is in CGAL/BGL/Helpers.h
|
|
||||||
|
|
||||||
template <typename FaceGraph>
|
template <typename FaceGraph>
|
||||||
bool is_border(typename boost::graph_traits<FaceGraph>::halfedge_descriptor hd, const FaceGraph& g)
|
bool is_border(typename boost::graph_traits<FaceGraph>::halfedge_descriptor hd, const FaceGraph& g)
|
||||||
{
|
{
|
||||||
return face(hd,g) == boost::graph_traits<FaceGraph>::null_face();
|
return face(hd,g) == boost::graph_traits<FaceGraph>::null_face();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
returns `true` if there are no
|
returns `true` if there are no
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef CGAL_BGL_HELPERS_H
|
#ifndef CGAL_BOOST_GRAPH_INTERNAL_HELPERS_H
|
||||||
#define CGAL_BGL_HELPERS_H
|
#define CGAL_BOOST_GRAPH_INTERNAL_HELPERS_H
|
||||||
|
|
||||||
#include <boost/graph/graph_traits.hpp>
|
#include <boost/graph/graph_traits.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
@ -7,23 +7,12 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
// breaks a dependency loop between <CGAL/BGL/Helper.h> and
|
// breaks a dependency loop between <CGAL/boost/graph/helpers.h>
|
||||||
// <CGAL/boost/graph/iterator.h>
|
// and <CGAL/boost/graph/iterator.h>
|
||||||
template <typename Graph> class Halfedge_around_target_iterator;
|
template <typename Graph> class Halfedge_around_target_iterator;
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Graph>
|
|
||||||
bool
|
|
||||||
is_border(typename boost::graph_traits<Graph>::halfedge_descriptor const& h
|
|
||||||
, const Graph& g)
|
|
||||||
{
|
|
||||||
return face(h,g) == boost::graph_traits<Graph>::null_face();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Graph>
|
template <typename Graph>
|
||||||
void
|
void
|
||||||
set_border(typename boost::graph_traits<Graph>::halfedge_descriptor const& h
|
set_border(typename boost::graph_traits<Graph>::halfedge_descriptor const& h
|
||||||
|
|
@ -278,4 +267,4 @@ bool is_valid(const Graph& g)
|
||||||
} // CGAL
|
} // CGAL
|
||||||
|
|
||||||
|
|
||||||
#endif /* CGAL_BGL_HELPERS_H */
|
#endif // CGAL_BOOST_GRAPH_INTERNAL_HELPERS_H
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#include <CGAL/assertions.h>
|
#include <CGAL/assertions.h>
|
||||||
#include <CGAL/circulator_bases.h>
|
#include <CGAL/circulator_bases.h>
|
||||||
#include <CGAL/BGL/Helper.h>
|
#include <CGAL/boost/graph/internal/helpers.h>
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,13 +59,13 @@ class Polyhedron_edge_index_map_external
|
||||||
: public boost::put_get_helper<std::size_t, Polyhedron_edge_index_map_external<Polyhedron> >
|
: public boost::put_get_helper<std::size_t, Polyhedron_edge_index_map_external<Polyhedron> >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::readable_property_map_tag category;
|
typedef boost::readable_property_map_tag category;
|
||||||
typedef std::size_t value_type;
|
typedef std::size_t value_type;
|
||||||
typedef std::size_t reference;
|
typedef std::size_t reference;
|
||||||
typedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor key_type;
|
typedef typename boost::graph_traits<Polyhedron>::edge_descriptor key_type;
|
||||||
|
|
||||||
Polyhedron_edge_index_map_external(Polyhedron& p)
|
Polyhedron_edge_index_map_external(Polyhedron& p)
|
||||||
: map_(std::size_t(-1), num_halfedges(p))
|
: map_(std::size_t(-1), num_halfedges(p)), p(p)
|
||||||
{
|
{
|
||||||
unsigned int data = 0;
|
unsigned int data = 0;
|
||||||
typename boost::graph_traits<Polyhedron>::edge_iterator it, end;
|
typename boost::graph_traits<Polyhedron>::edge_iterator it, end;
|
||||||
|
|
@ -75,10 +75,11 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reference operator[](const key_type& k) const { return map_[k]; }
|
reference operator[](const key_type& k) const { return map_[halfedge(k,p)]; }
|
||||||
private:
|
private:
|
||||||
CGAL::Unique_hash_map<typename boost::graph_traits<Polyhedron>::halfedge_descriptor,
|
CGAL::Unique_hash_map<typename boost::graph_traits<Polyhedron>::halfedge_descriptor,
|
||||||
std::size_t> map_;
|
std::size_t> map_;
|
||||||
|
Polyhedron& p;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Handle>
|
template<typename Handle>
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,6 @@ BOOST_AUTO_TEST_CASE_TEMPLATE( join_face_test, T, test_graphs )
|
||||||
set_halfedge(f.f1, e, f.m);
|
set_halfedge(f.f1, e, f.m);
|
||||||
CGAL::Euler::join_face(e,f.m);
|
CGAL::Euler::join_face(e,f.m);
|
||||||
|
|
||||||
CGAL::internal::set_constant_vertex_is_border(f.m);
|
|
||||||
|
|
||||||
BOOST_CHECK(CGAL::internal::exact_num_faces(f.m) == 2);
|
BOOST_CHECK(CGAL::internal::exact_num_faces(f.m) == 2);
|
||||||
BOOST_CHECK(CGAL::internal::exact_num_edges(f.m) == 6);
|
BOOST_CHECK(CGAL::internal::exact_num_edges(f.m) == 6);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ typedef CGAL::Surface_mesh<Point_3> SM;
|
||||||
typedef OpenMesh::PolyMesh_ArrayKernelT</* MyTraits*/> OMesh;
|
typedef OpenMesh::PolyMesh_ArrayKernelT</* MyTraits*/> OMesh;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <CGAL/BGL/Helper.h>
|
#include <CGAL/boost/graph/helpers.h>
|
||||||
|
|
||||||
// helper to easily define all graph_traits members
|
// helper to easily define all graph_traits members
|
||||||
#define CGAL_GRAPH_TRAITS_MEMBERS(T) \
|
#define CGAL_GRAPH_TRAITS_MEMBERS(T) \
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
#include <CGAL/AABB_tree.h>
|
#include <CGAL/AABB_tree.h>
|
||||||
#include <CGAL/AABB_traits.h>
|
#include <CGAL/AABB_traits.h>
|
||||||
#include <CGAL/AABB_halfedge_graph_segment_primitive.h>
|
#include <CGAL/AABB_halfedge_graph_segment_primitive.h>
|
||||||
#include <CGAL/boost/graph/halfedge_graph_traits_Polyhedron_3.h>
|
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h>
|
||||||
|
|
||||||
#include <CGAL/Vector_3.h>
|
#include <CGAL/Vector_3.h>
|
||||||
#include <CGAL/Point_3.h>
|
#include <CGAL/Point_3.h>
|
||||||
|
|
@ -48,7 +48,7 @@ template<class Polyhedron, class Kernel>
|
||||||
class Polyhedron_slicer_3
|
class Polyhedron_slicer_3
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
typedef AABB_halfedge_graph_segment_primitive<const Polyhedron> AABB_primitive;
|
typedef AABB_halfedge_graph_segment_primitive<Polyhedron> AABB_primitive;
|
||||||
typedef AABB_traits<Kernel, AABB_primitive> AABB_traits_;
|
typedef AABB_traits<Kernel, AABB_primitive> AABB_traits_;
|
||||||
typedef AABB_tree<AABB_traits_> AABB_tree_;
|
typedef AABB_tree<AABB_traits_> AABB_tree_;
|
||||||
|
|
||||||
|
|
@ -59,12 +59,12 @@ private:
|
||||||
typedef typename Kernel::Segment_3 Segment;
|
typedef typename Kernel::Segment_3 Segment;
|
||||||
typedef typename Kernel::Point_3 Point;
|
typedef typename Kernel::Point_3 Point;
|
||||||
|
|
||||||
typedef typename Polyhedron::Edge_const_iterator Edge_const_iterator;
|
typedef typename boost::graph_traits<Polyhedron>::edge_iterator Edge_const_iterator;
|
||||||
typedef typename Polyhedron::Halfedge_const_handle Halfedge_const_handle;
|
typedef typename boost::graph_traits<Polyhedron>::halfedge_descriptor Halfedge_const_handle;
|
||||||
typedef typename Polyhedron::Facet_const_handle Facet_const_handle;
|
typedef typename boost::graph_traits<Polyhedron>::face_descriptor Facet_const_handle;
|
||||||
typedef typename Polyhedron::Vertex_const_handle Vertex_const_handle;
|
typedef typename boost::graph_traits<Polyhedron>::vertex_descriptor Vertex_const_handle;
|
||||||
typedef typename Polyhedron::Halfedge_around_vertex_const_circulator Halfedge_around_vertex_const_circulator;
|
typedef Halfedge_around_target_circulator<Polyhedron> Halfedge_around_vertex_const_circulator;
|
||||||
typedef typename Polyhedron::Halfedge_around_facet_const_circulator Halfedge_around_facet_const_circulator;
|
typedef Halfedge_around_face_circulator<Polyhedron> Halfedge_around_facet_const_circulator;
|
||||||
|
|
||||||
// to unite halfedges under an "edge"
|
// to unite halfedges under an "edge"
|
||||||
struct Edge_comparator {
|
struct Edge_comparator {
|
||||||
|
|
@ -127,6 +127,7 @@ private:
|
||||||
typename Kernel::Intersect_3 intersect_3_functor;
|
typename Kernel::Intersect_3 intersect_3_functor;
|
||||||
AABB_tree_ tree;
|
AABB_tree_ tree;
|
||||||
mutable Node_graph node_graph;
|
mutable Node_graph node_graph;
|
||||||
|
Polyhedron& polyhedron;
|
||||||
|
|
||||||
boost::tuple<Point, Intersection_type, Vertex_const_handle>
|
boost::tuple<Point, Intersection_type, Vertex_const_handle>
|
||||||
halfedge_intersection(Halfedge_const_handle hf, const Plane& plane) const
|
halfedge_intersection(Halfedge_const_handle hf, const Plane& plane) const
|
||||||
|
|
@ -177,11 +178,11 @@ private:
|
||||||
Vertex_g v_g = boost::add_vertex(node_graph);
|
Vertex_g v_g = boost::add_vertex(node_graph);
|
||||||
node_graph[v_g].point = v->point();
|
node_graph[v_g].point = v->point();
|
||||||
|
|
||||||
Halfedge_around_vertex_const_circulator around_vertex_c = v->vertex_begin();
|
Halfedge_around_vertex_const_circulator around_vertex_c(v,polyhedron), done(around_vertex_c);
|
||||||
do {
|
do {
|
||||||
edge_node_map[around_vertex_c].put(v_g);
|
edge_node_map[*around_vertex_c].put(v_g);
|
||||||
}
|
}
|
||||||
while(++around_vertex_c != v->vertex_begin());
|
while(++around_vertex_c != done);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_intersection_edge_to_facet_neighbors(Halfedge_const_handle hf, Edge_node_map& edge_node_map) const {
|
void add_intersection_edge_to_facet_neighbors(Halfedge_const_handle hf, Edge_node_map& edge_node_map) const {
|
||||||
|
|
@ -212,11 +213,11 @@ private:
|
||||||
Node_pair& hf_node_pair = edge_node_map.find(hf)->second;
|
Node_pair& hf_node_pair = edge_node_map.find(hf)->second;
|
||||||
Vertex_g v_g = node_graph[hf_node_pair.v1].point == v->point() ? hf_node_pair.v1 : hf_node_pair.v2;// find node containing v
|
Vertex_g v_g = node_graph[hf_node_pair.v1].point == v->point() ? hf_node_pair.v1 : hf_node_pair.v2;// find node containing v
|
||||||
|
|
||||||
Halfedge_around_vertex_const_circulator around_vertex_c = v->vertex_begin();
|
Halfedge_around_vertex_const_circulator around_vertex_c(v, polyhedron), done(around_vertex_c);
|
||||||
do {
|
do {
|
||||||
if(around_vertex_c->is_border()) { continue;}
|
if((*around_vertex_c)->is_border()) { continue;}
|
||||||
Node_pair& around_vertex_node_pair = edge_node_map.find(around_vertex_c)->second;
|
Node_pair& around_vertex_node_pair = edge_node_map.find(*around_vertex_c)->second;
|
||||||
Halfedge_around_facet_const_circulator around_facet_c = around_vertex_c->facet_begin();
|
Halfedge_around_facet_const_circulator around_facet_c(*around_vertex_c,polyhedron), done2(around_facet_c);
|
||||||
do {
|
do {
|
||||||
CGAL_assertion(around_vertex_node_pair.vertex_count != 0);
|
CGAL_assertion(around_vertex_node_pair.vertex_count != 0);
|
||||||
if(around_vertex_node_pair.v1 != v_g) {
|
if(around_vertex_node_pair.v1 != v_g) {
|
||||||
|
|
@ -226,9 +227,9 @@ private:
|
||||||
boost::add_edge(around_vertex_node_pair.v2, v_g, node_graph);
|
boost::add_edge(around_vertex_node_pair.v2, v_g, node_graph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while(++around_facet_c != around_vertex_c->facet_begin());
|
while(++around_facet_c != done2);
|
||||||
}
|
}
|
||||||
while(++around_vertex_c != v->vertex_begin());
|
while(++around_vertex_c != done);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class OutputIterator>
|
template<class OutputIterator>
|
||||||
|
|
@ -419,9 +420,10 @@ public:
|
||||||
*/
|
*/
|
||||||
Polyhedron_slicer_3(const Polyhedron& polyhedron, const Kernel& kernel = Kernel())
|
Polyhedron_slicer_3(const Polyhedron& polyhedron, const Kernel& kernel = Kernel())
|
||||||
: intersect_3_functor(kernel.intersect_3_object()),
|
: intersect_3_functor(kernel.intersect_3_object()),
|
||||||
tree( undirected_edges(polyhedron).first,
|
tree( edges(polyhedron).first,
|
||||||
undirected_edges(polyhedron).second,
|
edges(polyhedron).second,
|
||||||
polyhedron)
|
polyhedron),
|
||||||
|
polyhedron(const_cast<Polyhedron&>(polyhedron))
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue