52 #ifndef OPENMESH_DECIMATER_MODROUNDNESST_HH
53 #define OPENMESH_DECIMATER_MODROUNDNESST_HH
61 #if defined(OM_CC_MSVC)
62 # define OM_ENABLE_WARNINGS 4244
63 # pragma warning(disable : OM_ENABLE_WARNINGS )
83 template <
class MeshT>
124 double priority = 0.0;
125 typename Mesh::FaceHandle fhC, fhB;
130 C =
vector_cast<Vec3f>(Base::mesh().point( Base::mesh().to_vertex_handle(voh_it)));
131 fhC = Base::mesh().face_handle( voh_it.handle() );
133 for (++voh_it; voh_it; ++voh_it)
137 C =
vector_cast<Vec3f>(Base::mesh().point(Base::mesh().to_vertex_handle(voh_it)));
138 fhC = Base::mesh().face_handle( voh_it.handle() );
140 if ( fhB == _ci.
fl || fhB == _ci.
fr )
144 r = roundness( vector_cast<Vec3f>(_ci.
p1), B, C );
147 priority = std::max( priority, (1.0-r) );
153 C =
vector_cast<Vec3f>(Base::mesh().point( Base::mesh().to_vertex_handle(voh_it)));
154 fhC = Base::mesh().face_handle( voh_it.handle() );
156 for (++voh_it; voh_it && (priority==Base::LEGAL_COLLAPSE); ++voh_it)
160 C =
vector_cast<Vec3f>(Base::mesh().point(Base::mesh().to_vertex_handle(voh_it)));
161 fhC = Base::mesh().face_handle( voh_it.handle() );
163 if ( fhB == _ci.
fl || fhB == _ci.
fr )
166 priority = ( (r=roundness( vector_cast<Vec3f>(_ci.
p1), B, C )) < min_r_)
167 ? Base::ILLEGAL_COLLAPSE : Base::LEGAL_COLLAPSE;
171 return (
float) priority;
177 if (_factor >= 0.0 && _factor <= 1.0) {
181 value_type min_roundness = min_r_ * _factor / this->error_tolerance_factor_;
183 this->error_tolerance_factor_ = _factor;
191 void set_min_angle(
float _angle,
bool )
193 assert( _angle > 0 && _angle < 60 );
195 _angle = float(M_PI * _angle /180.0);
200 B = Vec3f( 2*cos(_angle), 0, 0);
201 C = Vec3f( cos(_angle), sin(_angle), 0);
203 double r1 = roundness(A,B,C);
205 _angle = float(0.5 * ( M_PI - _angle ));
208 B = Vec3f( 2*cos(_angle), 0, 0);
209 C = Vec3f( cos(_angle), sin(_angle), 0);
211 double r2 = roundness(A,B,C);
213 set_min_roundness( value_type(std::min(r1,r2)),
true );
225 assert( 0.0 <= _min_roundness && _min_roundness <= 1.0 );
226 min_r_ = _min_roundness;
227 Base::set_binary(_binary);
234 Base::set_binary(
false);
278 double roundness(
const Vec3f& A,
const Vec3f& B,
const Vec3f &C )
280 const value_type epsilon = value_type(1e-15);
282 static const value_type sqrt43 = value_type(sqrt(4.0/3.0));
288 value_type aa = (B-C).sqrnorm();
289 value_type bb = vecAC.sqrnorm();
290 value_type cc = vecAB.sqrnorm();
291 value_type AA =
cross(vecAC,vecAB).sqrnorm();
296 double nom = AA * std::min( std::min(aa,bb),cc );
297 double denom = aa * bb * cc;
298 double nR = sqrt43 * sqrt(nom/denom);
313 #if defined(OM_CC_MSVC) && defined(OM_ENABLE_WARNINGS)
314 # pragma warning(default : OM_ENABLE_WARNINGS)
315 # undef OM_ENABLE_WARNINGS
318 #endif // OPENMESH_DECIMATER_MODROUNDNESST_HH defined