59#ifndef OPENMESH_DECIMATER_MODROUNDNESST_HH
60#define OPENMESH_DECIMATER_MODROUNDNESST_HH
68#if defined(OM_CC_MSVC)
69# define OM_ENABLE_WARNINGS 4244
70# pragma warning(disable : OM_ENABLE_WARNINGS )
99 typedef typename MeshT::Point Point;
129 typename Mesh::ConstVertexOHalfedgeIter voh_it(Base::mesh(), _ci.v0);
131 double priority = 0.0;
132 typename Mesh::FaceHandle fhC, fhB;
138 fhC = Base::mesh().face_handle( *voh_it );
140 for (++voh_it; voh_it.is_valid(); ++voh_it)
145 fhC = Base::mesh().face_handle( *voh_it );
147 if ( fhB == _ci.fl || fhB == _ci.fr )
154 priority = std::max( priority, (1.0-r) );
161 fhC = Base::mesh().face_handle( *voh_it );
163 for (++voh_it; voh_it.is_valid() && (priority==Base::LEGAL_COLLAPSE); ++voh_it)
168 fhC = Base::mesh().face_handle( *voh_it );
170 if ( fhB == _ci.fl || fhB == _ci.fr )
174 ? Base::ILLEGAL_COLLAPSE : Base::LEGAL_COLLAPSE;
178 return (
float) priority;
184 if (_factor >= 0.0 && _factor <= 1.0) {
188 value_type min_roundness = min_r_ * _factor / this->error_tolerance_factor_;
190 this->error_tolerance_factor_ = _factor;
198 void set_min_angle(
float _angle,
bool )
200 assert( _angle > 0 && _angle < 60 );
202 _angle = float(M_PI * _angle /180.0);
206 A =
Vec3f( 0.0f, 0.0f, 0.0f);
207 B =
Vec3f( 2.0f * cos(_angle), 0.0f, 0.0f);
208 C =
Vec3f( cos(_angle), sin(_angle), 0.0f);
210 double r1 = roundness(A,B,C);
212 _angle = float(0.5 * ( M_PI - _angle ));
214 A =
Vec3f( 0.0f, 0.0f, 0.0f);
215 B =
Vec3f( 2.0f*cos(_angle), 0.0f, 0.0f);
216 C =
Vec3f( cos(_angle), sin(_angle), 0.0f);
218 double r2 = roundness(A,B,C);
220 set_min_roundness(
value_type(std::min(r1,r2)),
true );
232 assert( 0.0 <= _min_roundness && _min_roundness <= 1.0 );
233 min_r_ = _min_roundness;
234 Base::set_binary(_binary);
241 Base::set_binary(
false);
303 double nom = AA * std::min( std::min(aa,bb),cc );
304 double denom = aa * bb * cc;
305 double nR = sqrt43 * sqrt(nom/denom);
320#if defined(OM_CC_MSVC) && defined(OM_ENABLE_WARNINGS)
321# pragma warning(default : OM_ENABLE_WARNINGS)
322# 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:154
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition MeshItems.hh:64
void vector_cast(const src_t &_src, dst_t &_dst, GenProg::Int2Type< n >)
Cast vector type to another vector type by copying the vector elements.
Definition vector_cast.hh:86
VectorT< float, 3 > Vec3f
3-float vector
Definition Vector11T.hh:769
Software related to mesh decimation.
decltype(std::declval< S >() *std::declval< S >()) sqrnorm() const
compute squared euclidean norm
Definition Vector11T.hh:396
T::value_type value_type
Type of the scalar value.
Definition vector_traits.hh:99
bool is_binary(void) const
Returns true if criteria returns a binary value.
Definition ModBaseT.hh:225
ModBaseT(MeshT &_mesh, bool _is_binary)
Default constructor.
Definition ModBaseT.hh:212
void unset_min_roundness()
Unset minimum value constraint and enable non-binary mode.
Definition ModRoundnessT.hh:238
void set_error_tolerance_factor(double _factor)
set the percentage of minimum roundness
Definition ModRoundnessT.hh:182
ModRoundnessT(MeshT &_dec)
Constructor.
Definition ModRoundnessT.hh:105
~ModRoundnessT()
Destructor.
Definition ModRoundnessT.hh:111
void set_min_roundness(value_type _min_roundness, bool _binary=true)
Set a minimum roundness value.
Definition ModRoundnessT.hh:230
float collapse_priority(const CollapseInfo &_ci)
Compute collapse priority due to roundness of triangle.
Definition ModRoundnessT.hh:125