In this post I will show how to compute edge length for a half-edge in CGAL::Polyhedron_3.
ComputeEdgeLength() Functor
ComputeEdgeLength() is a thread-safe functor for computing the edge length of a given half-edge in a CGAL::Polyhedron_3.
#ifndef _SMESHLIB_OPERATIONS_COMPUTEEDGELENGTH_H_
#define _SMESHLIB_OPERATIONS_COMPUTEEDGELENGTH_H_
namespace SMeshLib {
namespace Operations {
;
// The ComputeEdgeLength is a functor (delegate) to compute the length of a halfedge in CGAL::Polyhdeon_3.
// ComputeEdgeLength is thread-safe.
// TPolyhedron is a type of CGAL::Polyhdeon_3.
template<class TPolyhedron>
struct ComputeEdgeLength
{
public:
// Redefine types from TPolyhedron for convenience.
typedef typename TPolyhedron::Point_3 Point3;
typedef typename TPolyhedron::Halfedge Halfedge;
// Return type of operator() required by QtConcurrent.
typedef double result_type;
public:
// Compute edge length of a given half edge.
inline double operator () (const Halfedge& h)
{
const Point3& p = h.prev()->vertex()->point();
const Point3& q = h.vertex()->point();
return CGAL::sqrt(CGAL::squared_distance(p, q));
}
};
}; // End namespace Operations.
}; // End namespace SMeshLib.
#endif // _SMESHLIB_OPERATIONS_COMPUTEEDGELENGTH_H_
Using ComputeEdgeLength() Functor
Edge length of a half-edge h can be computed as double length = ComputeEdgeLength(h);.
For most purposes, it is better to compute length of all half-edges once and cache them for later use. It is best to store the results in an associative container which associates the half-edge handle with the edge length. In the following example, I use PropertyMap which is a wrapper for std::set.
#include "ImportOBJ.h"
#include "ComputeEdgeLength.h"
#include "PropertyMap.h"
#include "CGAL/Simple_cartesian.h"
#include "CGAL/Polyhedron_items_3.h"
#include "CGAL/HalfedgeDS_list.h"
#include "CGAL/Polyhedron_3.h"
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Polyhedron_3<Kernel,
CGAL::Polyhedron_items_3,
CGAL::HalfedgeDS_list> CgalPolyhedron;
// Compute the length of all half-edges in a CGAL::Polyhedron_3 and stores it
// in edgeLengths.
// TPolyhedron is a type of CGAL::Polyhedron_3.
// TEdgeLengths is a property map which associates the edge length to half-edge
// in the CGAL::Polyhdeon_3.
template<class TPolyhedron, class TEdgeLengths>
void computeEdgeLengths(const TPolyhedron& polyhedron, TEdgeLengths* edgeLengths)
{
if(edgeLengths == 0)
{
return;
}
typename TPolyhedron::Halfedge_const_iterator _begin = polyhedron.halfedges_begin();
typename TPolyhedron::Halfedge_const_iterator _end = polyhedron.halfedges_end();
SMeshLib::Operations::ComputeEdgeLength<TPolyhedron> _computeEdgeLength;
CGAL_For_all(_begin, _end)
{
edgeLengths->setValue(&*_begin, _computeEdgeLength(*_begin));
}
}
void testComputeEdgeLength()
{
CgalPolyhedron _poly;
SMeshLib::IO::importOBJ("Venus.obj", &_poly);
typedef SMeshLib::PropertyMap<const CgalPolyhedron::Halfedge*, double> EdgeLengthPM;
EdgeLengthPM _edgeLengths;
computeEdgeLengths(_poly, &_edgeLengths);
}
Downloads
ImportOBJ.h
PropertyMap.h
ComputeEdgeLength.h
TestComputeEdgeLength.cpp
Venus.obj
ImportOBJ.zip