54 #ifndef OPENMESH_DECIMATER_MODROUNDNESST_HH 
   55 #define OPENMESH_DECIMATER_MODROUNDNESST_HH 
   63 #if defined(OM_CC_MSVC) 
   64 #  define OM_ENABLE_WARNINGS 4244 
   65 #  pragma warning(disable : OM_ENABLE_WARNINGS ) 
   85 template <
class MeshT>
 
   94   typedef typename MeshT::Point                      Point;
 
  126     double                                  priority = 0.0; 
 
  132       C   = vector_cast<Vec3f>(Base::mesh().point( Base::mesh().to_vertex_handle(*voh_it)));
 
  133       fhC = Base::mesh().face_handle( *voh_it );
 
  135       for (++voh_it; voh_it.is_valid(); ++voh_it)
 
  139         C   = vector_cast<Vec3f>(Base::mesh().point(Base::mesh().to_vertex_handle(*voh_it)));
 
  140         fhC = Base::mesh().face_handle( *voh_it );
 
  142         if ( fhB == _ci.
fl || fhB == _ci.
fr )
 
  146         r = roundness( vector_cast<Vec3f>(_ci.
p1), B, C );
 
  149         priority = std::max( priority, (1.0-r) );
 
  155       C   = vector_cast<Vec3f>(Base::mesh().point( Base::mesh().to_vertex_handle(*voh_it)));
 
  156       fhC = Base::mesh().face_handle( *voh_it );
 
  158       for (++voh_it; voh_it.is_valid() && (priority==Base::LEGAL_COLLAPSE); ++voh_it)
 
  162         C   = vector_cast<Vec3f>(Base::mesh().point(Base::mesh().to_vertex_handle(*voh_it)));
 
  163         fhC = Base::mesh().face_handle( *voh_it );
 
  165         if ( fhB == _ci.
fl || fhB == _ci.
fr )
 
  168         priority = ( (r=roundness( vector_cast<Vec3f>(_ci.
p1), B, C )) < min_r_)
 
  169                   ? Base::ILLEGAL_COLLAPSE : Base::LEGAL_COLLAPSE;
 
  173     return (
float) priority;
 
  179       if (_factor >= 0.0 && _factor <= 1.0) {
 
  183         value_type min_roundness = min_r_ * 
static_cast<value_type
>(_factor / this->error_tolerance_factor_);
 
  185         this->error_tolerance_factor_ = _factor;
 
  193   void set_min_angle( 
float _angle, 
bool  )
 
  195     assert( _angle > 0 && _angle < 60 );
 
  197     _angle = float(M_PI * _angle /180.0);
 
  201     A = 
Vec3f(               0.0f, 0.0f,           0.0f);
 
  202     B = 
Vec3f( 2.0f * cos(_angle), 0.0f,           0.0f);
 
  203     C = 
Vec3f(        cos(_angle), sin(_angle),    0.0f);
 
  205     double r1 = roundness(A,B,C);
 
  207     _angle = float(0.5 * ( M_PI - _angle ));
 
  209     A = 
Vec3f(             0.0f, 0.0f,           0.0f);
 
  210     B = 
Vec3f( 2.0f*cos(_angle), 0.0f,           0.0f);
 
  211     C = 
Vec3f(      cos(_angle), sin(_angle),    0.0f);
 
  213     double r2 = roundness(A,B,C);
 
  227     assert( 0.0 <= _min_roundness && _min_roundness <= 1.0 );
 
  228     min_r_  = _min_roundness;
 
  229     Base::set_binary(_binary);
 
  236     Base::set_binary(
false);
 
  282     const value_type epsilon = value_type(1e-15);
 
  284     static const value_type sqrt43 = value_type(sqrt(4.0/3.0)); 
 
  290     value_type aa = (B-C).sqrnorm();
 
  291     value_type bb = vecAC.
sqrnorm();
 
  292     value_type cc = vecAB.
sqrnorm();
 
  293     value_type AA = cross(vecAC,vecAB).sqrnorm(); 
 
  298     double nom   = AA * std::min( std::min(aa,bb),cc );
 
  299     double denom = aa * bb * cc;
 
  300     double nR    = sqrt43 * sqrt(nom/denom);
 
  315 #if defined(OM_CC_MSVC) && defined(OM_ENABLE_WARNINGS) 
  316 #  pragma warning(default : OM_ENABLE_WARNINGS) 
  317 #  undef OM_ENABLE_WARNINGS 
Base class for all decimation modules.
 
#define DECIMATING_MODULE(Classname, MeshT, Name)
Convenience macro, to be used in derived modules The macro defines the types.
Definition: ModBaseT.hh:149
 
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:59
 
VectorT< float, 3 > Vec3f
3-float vector
Definition: Vector11T.hh:850
 
decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const
compute squared euclidean norm
Definition: Vector11T.hh:421
 
Kernel::FaceHandle FaceHandle
Scalar type.
Definition: PolyMeshT.hh:139
 
Kernel::ConstVertexOHalfedgeIter ConstVertexOHalfedgeIter
Circulator.
Definition: PolyMeshT.hh:173
 
Helper class providing information about a vector type.
Definition: vector_traits.hh:89
 
Stores information about a halfedge collapse.
Definition: CollapseInfoT.hh:74
 
Mesh::FaceHandle fr
Right face.
Definition: CollapseInfoT.hh:87
 
Mesh::Point p1
Positions of remaining vertex.
Definition: CollapseInfoT.hh:85
 
Mesh::VertexHandle v0
Vertex to be removed.
Definition: CollapseInfoT.hh:82
 
Mesh::FaceHandle fl
Left face.
Definition: CollapseInfoT.hh:86
 
Base class for all decimation modules.
Definition: ModBaseT.hh:193
 
bool is_binary(void) const
Returns true if criteria returns a binary value.
Definition: ModBaseT.hh:220
 
Use Roundness of triangles to control decimation.
Definition: ModRoundnessT.hh:87
 
void unset_min_roundness()
Unset minimum value constraint and enable non-binary mode.
Definition: ModRoundnessT.hh:233
 
ModRoundnessT(MeshT &_dec)
Constructor.
Definition: ModRoundnessT.hh:100
 
~ModRoundnessT()
Destructor.
Definition: ModRoundnessT.hh:106
 
void set_min_roundness(value_type _min_roundness, bool _binary=true)
Set a minimum roundness value.
Definition: ModRoundnessT.hh:225
 
float collapse_priority(const CollapseInfo &_ci) override
Compute collapse priority due to roundness of triangle.
Definition: ModRoundnessT.hh:120
 
void set_error_tolerance_factor(double _factor) override
set the percentage of minimum roundness
Definition: ModRoundnessT.hh:177