This commit is contained in:
Andreas Fabri 2018-07-16 17:27:00 +02:00
parent 01be9610ee
commit add9c72a46
3 changed files with 169 additions and 108 deletions

View File

@ -470,12 +470,10 @@ namespace Heat_method_3 {
*/ */
CGAL_precondition(is_triangle_mesh(tm)); CGAL_precondition(is_triangle_mesh(tm));
//vertex_id_map = get(Vertex_property_tag(),const_cast<TriangleMesh&>(tm));
Index i = 0; Index i = 0;
BOOST_FOREACH(vertex_descriptor vd, vertices(tm)){ BOOST_FOREACH(vertex_descriptor vd, vertices(tm)){
put(vertex_id_map, vd, i++); put(vertex_id_map, vd, i++);
} }
//face_id_map = get(Face_property_tag(), const_cast<TriangleMesh&>(tm));
Index face_i = 0; Index face_i = 0;
BOOST_FOREACH(face_descriptor fd, faces(tm)){ BOOST_FOREACH(face_descriptor fd, faces(tm)){
put(face_id_map, fd, face_i++); put(face_id_map, fd, face_i++);

View File

@ -73,6 +73,9 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
struct IDT_vertex_point_property_map; struct IDT_vertex_point_property_map;
template <typename IDT, typename PM>
struct IDT_vertex_distance_property_map;
/** /**
* Class `Intrinsic_Delaunay_Triangulation_3` is a ... * Class `Intrinsic_Delaunay_Triangulation_3` is a ...
* \tparam TriangleMesh a triangulated surface mesh, model of `FaceGraph` and `HalfedgeListGraph` * \tparam TriangleMesh a triangulated surface mesh, model of `FaceGraph` and `HalfedgeListGraph`
@ -86,14 +89,14 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
template <typename TriangleMesh, template <typename TriangleMesh,
typename Traits, typename Traits,
typename HalfedgeCoordinateMap, typename VertexDistanceMap,
typename VertexPointMap = typename boost::property_map< TriangleMesh, vertex_point_t>::const_type, typename VertexPointMap = typename boost::property_map< TriangleMesh, vertex_point_t>::const_type,
typename FaceIndexMap = typename boost::property_map< TriangleMesh, face_index_t>::const_type, typename FaceIndexMap = typename boost::property_map< TriangleMesh, face_index_t>::const_type,
typename EdgeIndexMap = typename boost::property_map< TriangleMesh, boost::edge_index_t>::const_type, typename EdgeIndexMap = typename boost::property_map< TriangleMesh, boost::edge_index_t>::const_type,
typename LA = Intrinsic_Delaunay_Triangulation_Eigen_traits_3> typename LA = Intrinsic_Delaunay_Triangulation_Eigen_traits_3>
struct Intrinsic_Delaunay_Triangulation_3 // AF was class fix later struct Intrinsic_Delaunay_Triangulation_3 // AF was class fix later
{ {
typedef Intrinsic_Delaunay_Triangulation_3<TriangleMesh,Traits,HalfedgeCoordinateMap,VertexPointMap,FaceIndexMap,EdgeIndexMap,LA> Self; typedef Intrinsic_Delaunay_Triangulation_3<TriangleMesh,Traits,VertexDistanceMap,VertexPointMap,FaceIndexMap,EdgeIndexMap,LA> Self;
typedef typename boost::graph_traits<TriangleMesh> graph_traits; typedef typename boost::graph_traits<TriangleMesh> graph_traits;
typedef typename graph_traits::vertex_descriptor vertex_descriptor; typedef typename graph_traits::vertex_descriptor vertex_descriptor;
@ -113,9 +116,12 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
typedef typename LA::Index Index; typedef typename LA::Index Index;
typedef typename boost::property_traits<VertexPointMap>::reference VertexPointMap_reference; typedef typename boost::property_traits<VertexPointMap>::reference VertexPointMap_reference;
typedef CGAL::dynamic_halfedge_property_t<Point_2> Halfedge_coordinate_tag;
typedef typename boost::property_map<TriangleMesh, Halfedge_coordinate_tag >::type HalfedgeCoordinateMap;
typedef typename boost::graph_traits<TriangleMesh>::vertices_size_type vertices_size_type; typedef typename boost::graph_traits<TriangleMesh>::vertices_size_type vertices_size_type;
typedef typename boost::graph_traits<TriangleMesh>::edges_size_type edges_size_type; typedef typename boost::graph_traits<TriangleMesh>::edges_size_type edges_size_type;
typedef typename boost::graph_traits<TriangleMesh>::faces_size_type faces_size_type; typedef typename boost::graph_traits<TriangleMesh>::faces_size_type faces_size_type;
typedef CGAL::dynamic_vertex_property_t<Index> Vertex_property_tag; typedef CGAL::dynamic_vertex_property_t<Index> Vertex_property_tag;
@ -132,8 +138,12 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
typedef typename std::stack<edge_descriptor, std::list<edge_descriptor> > edge_stack; typedef typename std::stack<edge_descriptor, std::list<edge_descriptor> > edge_stack;
friend struct IDT_vertex_point_property_map<Self>; friend struct IDT_vertex_point_property_map<Self>;
friend struct IDT_vertex_distance_property_map<Self,VertexDistanceMap>;
public: // for the BGL functions below. They should maybe become friend? public: // for the BGL functions below. They should maybe become friend?
typedef IDT_vertex_distance_property_map<Self,VertexDistanceMap> Vertex_distance_map;
struct Vertex_descriptor { struct Vertex_descriptor {
halfedge_descriptor hd; halfedge_descriptor hd;
@ -145,6 +155,11 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
Vertex_descriptor(const halfedge_descriptor& hd) Vertex_descriptor(const halfedge_descriptor& hd)
: hd(hd) : hd(hd)
{} {}
explicit Vertex_descriptor(const vertex_descriptor vd, const TriangleMesh& tm)
: hd(halfedge(vd,tm))
{}
}; };
struct Vertex_iterator_functor struct Vertex_iterator_functor
@ -165,16 +180,16 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
}; };
public: public:
Intrinsic_Delaunay_Triangulation_3(TriangleMesh& tm, HalfedgeCoordinateMap hcm) Intrinsic_Delaunay_Triangulation_3(TriangleMesh& tm, VertexDistanceMap vdm)
: tm(tm), hcm(hcm) : tm(tm), vdm(*this,vdm), hcm(get(Halfedge_coordinate_tag(), tm))
{ {
build(); build();
} }
Intrinsic_Delaunay_Triangulation_3(TriangleMesh& tm, HalfedgeCoordinateMap hcm, FaceIndexMap fpm, EdgeIndexMap epm) Intrinsic_Delaunay_Triangulation_3(TriangleMesh& tm, VertexDistanceMap vdm, FaceIndexMap fpm, EdgeIndexMap epm)
: tm(tm), hcm(hcm), fpm(fpm), epm(epm) : tm(tm), vdm(*this,vdm), fpm(fpm), epm(epm), hcm(get(Halfedge_coordinate_tag(), tm))
{ {
build(); build();
} }
@ -192,10 +207,18 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
return tm; return tm;
} }
const HalfedgeCoordinateMap& hcmap() const const HalfedgeCoordinateMap& hcmap() const
{ {
return hcm; return hcm;
} }
const Vertex_distance_map vertex_distance_map() const
{
return vdm;
}
double get_cotan_weight(edge_descriptor ed) double get_cotan_weight(edge_descriptor ed)
{ {
@ -402,6 +425,7 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
} }
//todo:: determine which can be const //todo:: determine which can be const
TriangleMesh& tm; TriangleMesh& tm;
Vertex_distance_map vdm;
VertexPointMap vpm; VertexPointMap vpm;
FaceIndexMap fpm; FaceIndexMap fpm;
EdgeIndexMap epm; EdgeIndexMap epm;
@ -419,14 +443,14 @@ namespace boost {
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
struct graph_traits<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> > { struct graph_traits<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> > {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> Mesh; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> Mesh;
typedef typename Mesh::Vertex_descriptor vertex_descriptor; typedef typename Mesh::Vertex_descriptor vertex_descriptor;
typedef boost::transform_iterator< typedef boost::transform_iterator<
typename Mesh::Vertex_iterator_functor, typename Mesh::Vertex_iterator_functor,
@ -450,59 +474,59 @@ namespace Intrinsic_Delaunay_Triangulation_3 {
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<TM>::vertices_size_type typename boost::graph_traits<TM>::vertices_size_type
num_vertices(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) num_vertices(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return num_vertices(idt.triangle_mesh()); return num_vertices(idt.triangle_mesh());
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<TM>::edges_size_type typename boost::graph_traits<TM>::edges_size_type
num_edges(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) num_edges(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return num_edges(idt.triangle_mesh()); return num_edges(idt.triangle_mesh());
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<TM>::faces_size_type typename boost::graph_traits<TM>::faces_size_type
num_faces(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) num_faces(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return num_faces(idt.triangle_mesh()); return num_faces(idt.triangle_mesh());
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename std::pair<typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>>::vertex_iterator, typename std::pair<typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>>::vertex_iterator,
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>>::vertex_iterator> typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>>::vertex_iterator>
vertices(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) vertices(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
std::pair<typename boost::graph_traits<TM>::vertex_iterator, std::pair<typename boost::graph_traits<TM>::vertex_iterator,
typename boost::graph_traits<TM>::vertex_iterator> p = vertices(idt.triangle_mesh()); typename boost::graph_traits<TM>::vertex_iterator> p = vertices(idt.triangle_mesh());
typedef typename boost::graph_traits<TM>::vertex_iterator vertex_iterator; typedef typename boost::graph_traits<TM>::vertex_iterator vertex_iterator;
typedef Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>::Vertex_iterator_functor Fct; typedef typename Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>::Vertex_iterator_functor Fct;
Fct fct(idt.triangle_mesh()); Fct fct(idt.triangle_mesh());
return std::make_pair(boost::make_transform_iterator(p.first, fct), return std::make_pair(boost::make_transform_iterator(p.first, fct),
boost::make_transform_iterator(p.second,fct)); boost::make_transform_iterator(p.second,fct));
@ -510,14 +534,14 @@ vertices(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt)
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename std::pair<typename boost::graph_traits<TM>::halfedge_iterator, typename std::pair<typename boost::graph_traits<TM>::halfedge_iterator,
typename boost::graph_traits<TM>::halfedge_iterator> typename boost::graph_traits<TM>::halfedge_iterator>
halfedges(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) halfedges(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return halfedges(idt.triangle_mesh()); return halfedges(idt.triangle_mesh());
} }
@ -525,14 +549,14 @@ halfedges(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename std::pair<typename boost::graph_traits<TM>::edge_iterator, typename std::pair<typename boost::graph_traits<TM>::edge_iterator,
typename boost::graph_traits<TM>::edge_iterator> typename boost::graph_traits<TM>::edge_iterator>
edges(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) edges(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return edges(idt.triangle_mesh()); return edges(idt.triangle_mesh());
} }
@ -540,57 +564,57 @@ edges(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt)
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename std::pair<typename boost::graph_traits<TM>::face_iterator, typename std::pair<typename boost::graph_traits<TM>::face_iterator,
typename boost::graph_traits<TM>::face_iterator> typename boost::graph_traits<TM>::face_iterator>
faces(const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) faces(const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return faces(idt.triangle_mesh()); return faces(idt.triangle_mesh());
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor
vertex(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd, vertex(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& ) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& )
{ {
return boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor(hd); return boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor(hd);
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor
halfedge(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::face_descriptor fd, halfedge(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::face_descriptor fd,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return halfedge(fd, idt.triangle_mesh()); return halfedge(fd, idt.triangle_mesh());
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor
halfedge(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::edge_descriptor ed, halfedge(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::edge_descriptor ed,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return halfedge(ed, idt.triangle_mesh()); return halfedge(ed, idt.triangle_mesh());
} }
@ -598,14 +622,14 @@ halfedge(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HC
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor
next(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd, next(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return next(hd, idt.triangle_mesh()); return next(hd, idt.triangle_mesh());
} }
@ -613,32 +637,32 @@ next(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VP
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor
source(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd, source(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
typedef typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor vertex_descriptor;
return vertex_descriptor(opposite(hd, idt.triangle_mesh())); return vertex_descriptor(opposite(hd, idt.triangle_mesh()));
} }
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor
target(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd, target(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::halfedge_descriptor hd,
const Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
typedef typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >::vertex_descriptor vertex_descriptor;
return vertex_descriptor(hd); return vertex_descriptor(hd);
} }
@ -684,12 +708,48 @@ target(typename boost::graph_traits<Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,
friend value_type get(const IDT_vertex_index_property_map<IDT,PM>& pm, friend value_type get(const IDT_vertex_index_property_map<IDT,PM>& pm,
key_type vd) key_type vd)
{ {
typename TM::vertex_descriptor tm_vd = target(vd.hd,pm.idt.triangle_mesh()); typename boost::graph_traits<TM>::vertex_descriptor tm_vd = target(vd.hd,pm.idt.triangle_mesh());
return get(pm,tm_vd); return get(pm,tm_vd);
} }
}; };
template <typename IDT, typename PM>
struct IDT_vertex_distance_property_map {
const IDT& idt;
PM pm;
typedef typename IDT::Triangle_mesh TM;
typedef typename IDT::Vertex_descriptor key_type;
typedef double value_type;
typedef value_type reference;
IDT_vertex_distance_property_map(const IDT& idt,
PM pm)
: idt(idt), pm(pm)
{}
friend value_type get(const IDT_vertex_distance_property_map<IDT,PM>& idtpm,
key_type vd)
{
typename boost::graph_traits<TM>::vertex_descriptor tm_vd = target(vd.hd, idtpm.idt.triangle_mesh());
return get(idtpm.pm,tm_vd);
}
friend void put(IDT_vertex_distance_property_map<IDT,PM> idtpm,
key_type vd,
value_type v)
{
typename boost::graph_traits<TM>::vertex_descriptor tm_vd = target(vd.hd, idtpm.idt.triangle_mesh());
// std::cout << "put " << typeid(pm).name() << std::endl;
put(idtpm.pm, tm_vd, v);
}
};
} // namespace Intrinsic_Delaunay_Triangulation_3 } // namespace Intrinsic_Delaunay_Triangulation_3
} // namespace CGAL } // namespace CGAL
@ -697,58 +757,58 @@ namespace boost {
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>,
CGAL::vertex_point_t > { CGAL::vertex_point_t > {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> IDT; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> IDT;
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<IDT> type; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<IDT> type;
typedef type const_type; typedef type const_type;
}; };
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> > CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >
get(CGAL::vertex_point_t, get(CGAL::vertex_point_t,
const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> >(idt); return CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_point_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> >(idt);
} }
////// change to face_index ////// change to face_index
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>,
CGAL::face_index_t > { CGAL::face_index_t > {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> IDT; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> IDT;
typedef typename property_map<TM, CGAL::face_index_t>::type type; typedef typename property_map<TM, CGAL::face_index_t>::type type;
typedef typename property_map<TM, CGAL::face_index_t>::const_type const_type; typedef typename property_map<TM, CGAL::face_index_t>::const_type const_type;
}; };
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename property_map<TM,CGAL::face_index_t>::type typename property_map<TM,CGAL::face_index_t>::type
get(CGAL::face_index_t fi, get(CGAL::face_index_t fi,
const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return get(fi, idt.triangle_mesh()); return get(fi, idt.triangle_mesh());
} }
@ -758,16 +818,16 @@ get(CGAL::face_index_t fi,
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA> typename LA>
typename property_map<TM,boost::vertex_index_t>::type typename property_map<TM,boost::vertex_index_t>::type
get(boost::vertex_index_t vi, get(boost::vertex_index_t vi,
const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
return CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_index_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, VPM >(idt, get(vi, idt.triangle_mesh())); return CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_vertex_index_property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>, VPM >(idt, get(vi, idt.triangle_mesh()));
} }
} // boost } // boost
@ -820,15 +880,15 @@ namespace boost {
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA, typename LA,
typename dT> typename dT>
struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, struct property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>,
CGAL::dynamic_vertex_property_t<dT> > { CGAL::dynamic_vertex_property_t<dT> > {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> IDT; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> IDT;
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_dynamic_vertex_property_map<IDT, typedef CGAL::Intrinsic_Delaunay_Triangulation_3::IDT_dynamic_vertex_property_map<IDT,
typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::type, typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::type,
typename boost::graph_traits<IDT>::vertex_descriptor, typename boost::graph_traits<IDT>::vertex_descriptor,
@ -846,17 +906,17 @@ namespace CGAL {
namespace Intrinsic_Delaunay_Triangulation_3 { namespace Intrinsic_Delaunay_Triangulation_3 {
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA, typename LA,
typename dT> typename dT>
typename boost::property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, CGAL::dynamic_vertex_property_t<dT> >::const_type typename boost::property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>, CGAL::dynamic_vertex_property_t<dT> >::const_type
get(CGAL::dynamic_vertex_property_t<dT> dvp, get(CGAL::dynamic_vertex_property_t<dT> dvp,
const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) const CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> IDT; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> IDT;
typedef IDT_dynamic_vertex_property_map<IDT, typedef IDT_dynamic_vertex_property_map<IDT,
typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::const_type, typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::const_type,
typename boost::graph_traits<IDT>::vertex_descriptor, typename boost::graph_traits<IDT>::vertex_descriptor,
@ -866,17 +926,17 @@ get(CGAL::dynamic_vertex_property_t<dT> dvp,
template <typename TM, template <typename TM,
typename T, typename T,
typename HCM, typename VDM,
typename VPM, typename VPM,
typename FIM, typename FIM,
typename EIM, typename EIM,
typename LA, typename LA,
typename dT> typename dT>
typename boost::property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>, CGAL::dynamic_vertex_property_t<dT> >::type typename boost::property_map<CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>, CGAL::dynamic_vertex_property_t<dT> >::type
get(CGAL::dynamic_vertex_property_t<dT> dvp, get(CGAL::dynamic_vertex_property_t<dT> dvp,
CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA>& idt) CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA>& idt)
{ {
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,HCM,VPM,FIM,EIM,LA> IDT; typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<TM,T,VDM,VPM,FIM,EIM,LA> IDT;
typedef IDT_dynamic_vertex_property_map<IDT, typedef IDT_dynamic_vertex_property_map<IDT,
typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::type, typename boost::property_map<TM, CGAL::dynamic_vertex_property_t<dT> >::type,
typename boost::graph_traits<IDT>::vertex_descriptor, typename boost::graph_traits<IDT>::vertex_descriptor,

View File

@ -14,25 +14,22 @@
typedef CGAL::Simple_cartesian<double> Kernel; typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point; typedef Kernel::Point_3 Point;
typedef Kernel::Point_2 Point_2; typedef Kernel::Point_2 Point_2;
typedef CGAL::Surface_mesh<Point> BaseMesh; typedef CGAL::Surface_mesh<Point> Surface_mesh;
typedef CGAL::dynamic_halfedge_property_t<Point_2> Halfedge_coordinate_tag;
typedef boost::property_map<BaseMesh, Halfedge_coordinate_tag >::type Halfedge_coordinate_map;
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<BaseMesh,Kernel, Halfedge_coordinate_map> Mesh;
typedef CGAL::dynamic_vertex_property_t<double> Vertex_distance_tag; typedef CGAL::dynamic_vertex_property_t<double> Vertex_distance_tag;
typedef boost::property_map<Mesh, Vertex_distance_tag >::type Vertex_distance_map; typedef boost::property_map<Surface_mesh, Vertex_distance_tag >::type Vertex_distance_map;
typedef CGAL::Intrinsic_Delaunay_Triangulation_3::Intrinsic_Delaunay_Triangulation_3<Surface_mesh,Kernel, Vertex_distance_map> Idt;
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor; typedef boost::graph_traits<Idt>::vertex_descriptor vertex_descriptor;
typedef CGAL::Heat_method_3::Heat_method_3<Mesh,Kernel,Vertex_distance_map> Heat_method; typedef CGAL::Heat_method_3::Heat_method_3<Idt,Kernel, Idt::Vertex_distance_map> Heat_method;
typedef CGAL::Heat_method_3::Heat_method_Eigen_traits_3::SparseMatrix SparseMatrix; typedef CGAL::Heat_method_3::Heat_method_Eigen_traits_3::SparseMatrix SparseMatrix;
#if 0 #if 0
void source_set_tests(Heat_method hm, const Mesh& sm) void source_set_tests(Heat_method hm, const Idt& sm)
{ {
vertex_descriptor source = *(vertices(sm).first); vertex_descriptor source = *(vertices(sm).first);
hm.add_source(source); hm.add_source(source);
@ -98,7 +95,7 @@ void check_for_unit(const Eigen::MatrixXd& X, int dimension)
} }
} }
void check_no_update(const Mesh& sm, const Vertex_distance_map& original, const Vertex_distance_map& updated) void check_no_update(const Idt& sm, const Vertex_distance_map& original, const Vertex_distance_map& updated)
{ {
BOOST_FOREACH(vertex_descriptor vd, vertices(sm)) BOOST_FOREACH(vertex_descriptor vd, vertices(sm))
{ {
@ -111,30 +108,36 @@ void check_no_update(const Mesh& sm, const Vertex_distance_map& original, const
int main() int main()
{ {
BaseMesh bm; Surface_mesh sm;
Halfedge_coordinate_map hcm; Vertex_distance_map vdm = get(Vertex_distance_tag(),sm);
Mesh sm(bm,hcm);
Idt idt(sm, vdm);
Vertex_distance_map vertex_distance_map = get(Vertex_distance_tag(),sm);
bool idf = false; bool idf = false;
std::ifstream in("data/pyramid0.off"); std::ifstream in("data/pyramid0.off");
in >> bm; in >> sm;
if(!in || num_vertices(bm) == 0) { if(!in || num_vertices(sm) == 0) {
std::cerr << "Problem loading the input data" << std::endl; std::cerr << "Problem loading the input data" << std::endl;
return 1; return 1;
} }
put(vertex_distance_map, * vertices(sm).first, 1.0); //put(vdm, * vertices(sm).first, 1.0);
put(vertex_distance_map, * halfedges(sm).first, 1.0); //put(vdm, * halfedges(sm).first, 1.0);
//source set tests //source set tests
Heat_method hm(sm, vertex_distance_map); Heat_method hm(idt, idt.vertex_distance_map());
hm.add_source(* vertices(sm).first); // hm.add_source(* vertices(idt).first);
hm.add_source(boost::graph_traits<Idt>::vertex_descriptor(boost::graph_traits<Surface_mesh>::vertex_descriptor(0),sm));
hm.update(); hm.update();
#if 0 #if 0
source_set_tests(hm,sm);
source_set_tests(hm,idt);
//cotan matrix tests //cotan matrix tests
const SparseMatrix& M = hm.mass_matrix(); const SparseMatrix& M = hm.mass_matrix();
//std::cout<<"and M is: "<< Eigen::MatrixXd(M) << "\n"; //std::cout<<"and M is: "<< Eigen::MatrixXd(M) << "\n";