57 #include <OpenMesh/Core/Utils/vector_cast.hh>
58 #include <OpenMesh/Core/Utils/Property.hh>
62 #if defined(OM_CC_MIPS)
72 namespace Subdivider {
78 template <
typename MeshType,
typename RealType =
float>
82 typedef std::pair<typename MeshType::EdgeHandle, RealType> queueElement;
84 bool operator()(
const queueElement& t1,
const queueElement& t2)
86 return (t1.second < t2.second);
97 template <
typename MeshType,
typename RealType =
float>
102 typedef RealType real_t;
103 typedef MeshType mesh_t;
106 typedef std::vector< std::vector<real_t> > weights_t;
107 typedef std::vector<real_t> weight_t;
109 typedef std::pair< typename mesh_t::EdgeHandle, real_t > queueElement;
128 const char *
name()
const {
return "Longest Edge Split"; }
130 void set_max_edge_length(
double _value) {
131 max_edge_length_squared_ = _value * _value;
149 bool subdivide( MeshType& _m,
size_t _n ,
const bool _update_points =
true)
157 typename mesh_t::EdgeIter edgesEnd = _m.edges_end();
158 for (
typename mesh_t::EdgeIter eit = _m.edges_begin(); eit != edgesEnd; ++eit) {
159 const typename MeshType::Point to = _m.point(_m.to_vertex_handle(_m.halfedge_handle(*eit,0)));
160 const typename MeshType::Point from = _m.point(_m.from_vertex_handle(_m.halfedge_handle(*eit,0)));
162 real_t length = (to - from).sqrnorm();
165 if ( length > max_edge_length_squared_ )
166 queue.push( queueElement(*eit,length) );
170 while ( !stop && ! queue.empty() ) {
171 queueElement a = queue.top();
174 if ( a.second < max_edge_length_squared_ ) {
178 const typename MeshType::Point to = _m.point(_m.to_vertex_handle(_m.halfedge_handle(a.first,0)));
179 const typename MeshType::Point from = _m.point(_m.from_vertex_handle(_m.halfedge_handle(a.first,0)));
180 const typename MeshType::Point midpoint =
static_cast<typename MeshType::Point::value_type
>(0.5) * (to + from);
182 const typename MeshType::VertexHandle newVertex = _m.add_vertex(midpoint);
183 _m.split(a.first,newVertex);
185 for (
typename MeshType::VertexOHalfedgeIter voh_it(_m,newVertex); voh_it.is_valid(); ++voh_it) {
186 typename MeshType::EdgeHandle eh = _m.edge_handle(*voh_it);
187 const typename MeshType::Point to = _m.point(_m.to_vertex_handle(*voh_it));
188 const typename MeshType::Point from = _m.point(_m.from_vertex_handle(*voh_it));
189 real_t length = (to - from).sqrnorm();
192 if ( length > max_edge_length_squared_ )
193 queue.push( queueElement(eh,length) );
199 #if defined(_DEBUG) || defined(DEBUG)
210 real_t max_edge_length_squared_;
Check integrity of mesh.
Definition: MeshCheckerT.hh:71
bool subdivide(MeshType &_m, size_t _n, const bool _update_points=true)
Subdivide mesh _m _n times.
Definition: LongestEdgeT.hh:149
Definition: LongestEdgeT.hh:79
const char * name() const
Return name of subdivision algorithm.
Definition: LongestEdgeT.hh:128
bool cleanup(mesh_t &_m)
Cleanup mesh after usage, e.g. remove added properties.
Definition: LongestEdgeT.hh:143
Uniform LongestEdgeT subdivision algorithm
Definition: LongestEdgeT.hh:98
Abstract base class for uniform subdivision algorithms.
Definition: SubdividerT.hh:87
bool prepare(mesh_t &_m)
Prepare mesh, e.g. add properties.
Definition: LongestEdgeT.hh:137