mirror of https://github.com/CGAL/cgal
make the edge_descriptor of Polyhedron hashable
This commit is contained in:
parent
5c6b54257a
commit
cdec3d6414
|
|
@ -10,3 +10,4 @@ Polyhedron
|
||||||
Triangulation_2
|
Triangulation_2
|
||||||
Surface_mesh_simplification
|
Surface_mesh_simplification
|
||||||
Property_map
|
Property_map
|
||||||
|
Miscellany
|
||||||
|
|
|
||||||
|
|
@ -27,14 +27,14 @@ The traits class `boost::graph_traits< CGAL::Polyhedron_3<T> >` provides the fol
|
||||||
| Member | Value | Description |
|
| Member | Value | Description |
|
||||||
| :----------------------- | :----: | :---------- |
|
| :----------------------- | :----: | :---------- |
|
||||||
| `vertex_descriptor` | `Polyhedron_3::Vertex_handle` | The vertex descriptor |
|
| `vertex_descriptor` | `Polyhedron_3::Vertex_handle` | The vertex descriptor |
|
||||||
| `edge_descriptor` | `Polyhedron_3::Halfedge_handle` | The edge descriptor |
|
| `edge_descriptor` | `unspecified_type` | The edge descriptor |
|
||||||
| `halfedge_descriptor` | `Polyhedron_3::Halfedge_handle` | The halfedge descriptor |
|
| `halfedge_descriptor` | `Polyhedron_3::Halfedge_handle` | The halfedge descriptor |
|
||||||
| `face_descriptor` | `Polyhedron_3::Face_handle` | The face descriptor |
|
| `face_descriptor` | `Polyhedron_3::Face_handle` | The face descriptor |
|
||||||
| `adjacency_iterator` | `CGAL::Vertex_around_target_iterator<Polyhedron_3<T> >` | Iterates through adjacent vertices|
|
| `adjacency_iterator` | `CGAL::Vertex_around_target_iterator<Polyhedron_3<T> >` | Iterates through adjacent vertices|
|
||||||
| `out_edge_iterator` | `CGAL::Out_edge_iterator<Polyhedron_3<T> >` | Iterate through the out-edges of a vertex. |
|
| `out_edge_iterator` | `CGAL::Out_edge_iterator<Polyhedron_3<T> >` | Iterate through the out-edges of a vertex. |
|
||||||
| `in_edge_iterator` | `CGAL::Out_edge_iterator<Polyhedron_3<T> >` | Iterate through the in-edges of a vertex. |
|
| `in_edge_iterator` | `CGAL::Out_edge_iterator<Polyhedron_3<T> >` | Iterate through the in-edges of a vertex. |
|
||||||
| `vertex_iterator` | `unspecified_type` | Iterate through the vertices of a polyhedron.|
|
| `vertex_iterator` | `unspecified_type` | Iterate through the vertices of a polyhedron.|
|
||||||
| `edge_iterator` | `Polyhedron_3::Halfedge_iterator` | Iterate through the edges of a polyhedron.|
|
| `edge_iterator` | `unspecified_type` | Iterate through the edges of a polyhedron.|
|
||||||
| `halfedge_iterator` | `Polyhedron_3::Halfedge_iterator` | Iterate through the halfedges of a polyhedron.|
|
| `halfedge_iterator` | `Polyhedron_3::Halfedge_iterator` | Iterate through the halfedges of a polyhedron.|
|
||||||
| `face_iterator` | `Polyhedron_3::Face_iterator` | Iterate through the faces of a polyhedron.|
|
| `face_iterator` | `Polyhedron_3::Face_iterator` | Iterate through the faces of a polyhedron.|
|
||||||
| `directed_category` | Inherits from `boost::bidirectional_graph_tag`, `boost::vertex_list_graph_tag` and `boost::edge_list_graph_tag` | |
|
| `directed_category` | Inherits from `boost::bidirectional_graph_tag`, `boost::vertex_list_graph_tag` and `boost::edge_list_graph_tag` | |
|
||||||
|
|
@ -44,6 +44,8 @@ The traits class `boost::graph_traits< CGAL::Polyhedron_3<T> >` provides the fol
|
||||||
| `edges_size_type` | `Polyhedron_3::size_type` | The size type of the edge list |
|
| `edges_size_type` | `Polyhedron_3::size_type` | The size type of the edge list |
|
||||||
| `degree_size_type` | `Polyhedron_3::size_type` | The size type of the adjacency list |
|
| `degree_size_type` | `Polyhedron_3::size_type` | The size type of the adjacency list |
|
||||||
|
|
||||||
|
For convenience, the type `edge_descriptor` is hashable using the functor `CGAL::Handle_hash_function`
|
||||||
|
that is the default hash functor of `CGAL::Unique_hash_map`.
|
||||||
|
|
||||||
\section BGLT2GT Specializations for the 2D Triangulation Classes
|
\section BGLT2GT Specializations for the 2D Triangulation Classes
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@
|
||||||
#include <CGAL/basic.h>
|
#include <CGAL/basic.h>
|
||||||
#include <CGAL/boost/graph/iterator.h>
|
#include <CGAL/boost/graph/iterator.h>
|
||||||
|
|
||||||
|
#include <CGAL/Handle_hash_function.h>
|
||||||
|
|
||||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||||
#include <CGAL/boost/graph/halfedge_graph_traits.h>
|
#include <CGAL/boost/graph/halfedge_graph_traits.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -134,6 +136,22 @@ private:
|
||||||
Halfedge_handle halfedge_;
|
Halfedge_handle halfedge_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// make edge_descriptor hashable by default in Unique_hash_map
|
||||||
|
namespace handle{
|
||||||
|
template<typename Halfedge_handle>
|
||||||
|
struct Hash_functor< HDS_edge<Halfedge_handle> >
|
||||||
|
{
|
||||||
|
std::size_t
|
||||||
|
operator()(const HDS_edge<Halfedge_handle>& edge)
|
||||||
|
{
|
||||||
|
Halfedge_handle he = edge.halfedge();
|
||||||
|
if ( he < he->opposite() )
|
||||||
|
return Hash_functor<Halfedge_handle>()(he);
|
||||||
|
return Hash_functor<Halfedge_handle>()(he->opposite());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} //end of namespace handle
|
||||||
|
|
||||||
template<typename Halfedge_handle>
|
template<typename Halfedge_handle>
|
||||||
struct Construct_edge {
|
struct Construct_edge {
|
||||||
typedef HDS_edge<Halfedge_handle> result_type;
|
typedef HDS_edge<Halfedge_handle> result_type;
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ private:
|
||||||
CGAL::Unique_hash_map<key_type,std::size_t> map_;
|
CGAL::Unique_hash_map<key_type,std::size_t> map_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Special case for edges. Hashes each half_edge.
|
// Special case for edges.
|
||||||
template<class Polyhedron>
|
template<class Polyhedron>
|
||||||
class Polyhedron_edge_index_map_external
|
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> >
|
||||||
|
|
@ -62,21 +62,17 @@ public:
|
||||||
typedef typename boost::graph_traits<Polyhedron>::edge_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)), p(p)
|
: map_(std::size_t(-1), num_halfedges(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;
|
||||||
for(boost::tie(it, end) = edges(p); it != end; ++it, ++data) {
|
for(boost::tie(it, end) = edges(p); it != end; ++it, ++data)
|
||||||
map_[halfedge(*it, p)] = data;
|
map_[*it] = data;
|
||||||
map_[opposite(halfedge(*it, p), p)] = data;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reference operator[](const key_type& k) const { return map_[halfedge(k,p)]; }
|
reference operator[](const key_type& k) const { return map_[k]; }
|
||||||
private:
|
private:
|
||||||
CGAL::Unique_hash_map<typename boost::graph_traits<Polyhedron>::halfedge_descriptor,
|
CGAL::Unique_hash_map<key_type,std::size_t> map_;
|
||||||
std::size_t> map_;
|
|
||||||
Polyhedron& p;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Handle>
|
template<typename Handle>
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,28 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
|
|
||||||
|
//mechanism to abuse Handle_hash_function which is the default
|
||||||
|
//template parameter of Unique_hash_map
|
||||||
|
namespace internal{
|
||||||
|
namespace handle {
|
||||||
|
template <class H>
|
||||||
|
struct Hash_functor{
|
||||||
|
std::size_t
|
||||||
|
operator()(const H& h)
|
||||||
|
{
|
||||||
|
return std::size_t(&*h) /
|
||||||
|
sizeof( typename std::iterator_traits<H>::value_type);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Handle_hash_function {
|
struct Handle_hash_function {
|
||||||
typedef std::size_t result_type;
|
typedef std::size_t result_type;
|
||||||
template <class H>
|
template <class H>
|
||||||
std::size_t operator() (const H& h) const {
|
std::size_t operator() (const H& h) const {
|
||||||
return std::size_t(&*h) /
|
return ::CGAL::internal::handle::Hash_functor<H>()(h);
|
||||||
sizeof( typename std::iterator_traits<H>::value_type);
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace CGAL
|
} //namespace CGAL
|
||||||
|
|
|
||||||
|
|
@ -204,6 +204,12 @@ and <code>src/</code> directories).
|
||||||
</ul>
|
</ul>
|
||||||
<h3>Triangulated Surface Mesh Simplification</h3>
|
<h3>Triangulated Surface Mesh Simplification</h3>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
Breaking change: Due to the cleanup of the concepts of the package <em>CGAL and the Boost Graph Library</em>,
|
||||||
|
the named parameter <code>edge_is_border_map</code> has been removed, and the named parameter
|
||||||
|
<code>edge_is_constrained_map</code> now expects a property map with an edge descriptor as key type
|
||||||
|
(vs. halfedge descriptor before).
|
||||||
|
</li>
|
||||||
<li>Add some optimization in the code making the implementation faster
|
<li>Add some optimization in the code making the implementation faster
|
||||||
(depending on the cost and the placement chosen). However, for an edge which
|
(depending on the cost and the placement chosen). However, for an edge which
|
||||||
collapse is not topologically valid, the vector of vertices of the link provided
|
collapse is not topologically valid, the vector of vertices of the link provided
|
||||||
|
|
@ -213,7 +219,7 @@ and <code>src/</code> directories).
|
||||||
but if it is a absolute requirement for user defined cost/placement, defining
|
but if it is a absolute requirement for user defined cost/placement, defining
|
||||||
the macro <code>CGAL_SMS_EDGE_PROFILE_ALWAYS_NEED_UNIQUE_VERTEX_IN_LINK</code>
|
the macro <code>CGAL_SMS_EDGE_PROFILE_ALWAYS_NEED_UNIQUE_VERTEX_IN_LINK</code>
|
||||||
will restore the former behavior.
|
will restore the former behavior.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>Triangulated Surface Mesh Deformation (new package)</h3>
|
<h3>Triangulated Surface Mesh Deformation (new package)</h3>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <CGAL/Simple_cartesian.h>
|
#include <CGAL/Simple_cartesian.h>
|
||||||
#include <CGAL/Polyhedron_3.h>
|
#include <CGAL/Polyhedron_3.h>
|
||||||
#include <CGAL/IO/Polyhedron_iostream.h>
|
#include <CGAL/IO/Polyhedron_iostream.h>
|
||||||
|
|
@ -25,24 +27,8 @@ typedef boost::graph_traits<Surface_mesh>::edge_iterator edge_iterator;
|
||||||
|
|
||||||
namespace SMS = CGAL::Surface_mesh_simplification ;
|
namespace SMS = CGAL::Surface_mesh_simplification ;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// BGL property map which indicates whether an edge is marked as non-removable
|
// BGL property map which indicates whether an edge is marked as non-removable
|
||||||
|
|
||||||
struct Hash
|
|
||||||
{
|
|
||||||
typedef std::size_t result_type;
|
|
||||||
|
|
||||||
result_type operator()(const edge_descriptor& ed) const
|
|
||||||
{
|
|
||||||
// although two edge_descriptors may be equal, they may store any of its two halfedges
|
|
||||||
CGAL::Handle_hash_function hhf;
|
|
||||||
std::size_t st1 = hhf(halfedge(ed,Surface_mesh()));
|
|
||||||
std::size_t st2 = hhf(opposite(halfedge(ed,Surface_mesh()),Surface_mesh()));
|
|
||||||
return (std::min)(st1,st2);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Constrained_edge_map : public boost::put_get_helper<bool,Constrained_edge_map>
|
struct Constrained_edge_map : public boost::put_get_helper<bool,Constrained_edge_map>
|
||||||
{
|
{
|
||||||
typedef boost::readable_property_map_tag category;
|
typedef boost::readable_property_map_tag category;
|
||||||
|
|
@ -50,7 +36,7 @@ struct Constrained_edge_map : public boost::put_get_helper<bool,Constrained_edge
|
||||||
typedef bool reference;
|
typedef bool reference;
|
||||||
typedef edge_descriptor key_type;
|
typedef edge_descriptor key_type;
|
||||||
|
|
||||||
Constrained_edge_map(const CGAL::Unique_hash_map<key_type,bool,Hash>& aConstraints)
|
Constrained_edge_map(const CGAL::Unique_hash_map<key_type,bool>& aConstraints)
|
||||||
: mConstraints(aConstraints)
|
: mConstraints(aConstraints)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
@ -61,7 +47,7 @@ struct Constrained_edge_map : public boost::put_get_helper<bool,Constrained_edge
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const CGAL::Unique_hash_map<key_type,bool,Hash>& mConstraints;
|
const CGAL::Unique_hash_map<key_type,bool>& mConstraints;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool is_border (edge_descriptor e, const Surface_mesh& sm)
|
bool is_border (edge_descriptor e, const Surface_mesh& sm)
|
||||||
|
|
@ -77,7 +63,7 @@ Point_3 point(vertex_descriptor vd, const Surface_mesh& sm)
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
CGAL::Unique_hash_map<edge_descriptor,bool,Hash> constraint_hmap(false);
|
CGAL::Unique_hash_map<edge_descriptor,bool> constraint_hmap(false);
|
||||||
|
|
||||||
Surface_mesh surface_mesh;
|
Surface_mesh surface_mesh;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ namespace SMS = CGAL::Surface_mesh_simplification ;
|
||||||
// BGL property map which indicates whether an edge is marked as non-removable
|
// BGL property map which indicates whether an edge is marked as non-removable
|
||||||
//
|
//
|
||||||
struct Border_is_constrained_edge_map{
|
struct Border_is_constrained_edge_map{
|
||||||
const Surface_mesh* sm;
|
const Surface_mesh* sm_ptr;
|
||||||
typedef boost::graph_traits<Surface_mesh>::edge_descriptor key_type;
|
typedef boost::graph_traits<Surface_mesh>::edge_descriptor key_type;
|
||||||
typedef bool value_type;
|
typedef bool value_type;
|
||||||
typedef value_type reference;
|
typedef value_type reference;
|
||||||
|
|
@ -39,12 +39,11 @@ struct Border_is_constrained_edge_map{
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Border_is_constrained_edge_map(const Surface_mesh& sm)
|
Border_is_constrained_edge_map(const Surface_mesh& sm)
|
||||||
: sm(&sm)
|
: sm_ptr(&sm)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
friend bool get(Border_is_constrained_edge_map m, key_type edge) {
|
friend bool get(Border_is_constrained_edge_map m, const key_type& edge) {
|
||||||
return (face(halfedge(edge,*m.sm),*m.sm) == boost::graph_traits<Surface_mesh>::null_face())
|
return CGAL::is_border(edge, *m.sm_ptr);
|
||||||
|| (face(opposite(halfedge(edge,*m.sm),*m.sm),*m.sm) == boost::graph_traits<Surface_mesh>::null_face());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue