00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035
00036
00037
00038
00039
00040
00041 #ifndef OPENMESH_TOOLS_MODROUNDNESST_HH
00042 #define OPENMESH_TOOLS_MODROUNDNESST_HH
00043
00044
00045
00046
00047 #include <OpenMesh/Tools/Decimater/ModBaseT.hh>
00048 #include <math.h>
00049
00050
00051
00052
00053
00054 namespace OpenMesh {
00055 namespace Decimater {
00056
00057
00058
00059
00060
00063 template <class DecimaterType>
00064 class ModRoundnessT : public ModBaseT<DecimaterType>
00065 {
00066 public:
00067
00068 DECIMATING_MODULE( ModRoundnessT, DecimaterType, Roundness );
00069
00070 typedef typename Mesh::Point Point;
00071 typedef typename Mesh::Scalar Scalar;
00072
00073
00075 ModRoundnessT( DecimaterType &_dec )
00076 : Base(_dec, true), mesh_(Self::mesh()), min_roundness_(0.2f)
00077 {}
00078
00079
00080
00081 public:
00082
00083
00084 float collapse_priority(const CollapseInfo& _ci)
00085 {
00086 typename Mesh::VertexHandle v2, v3;
00087 typename Mesh::Scalar r, rmin(1.0);
00088 typename Mesh::CVVIter vv_it(mesh_, _ci.v0);
00089
00090
00091 v3 = vv_it.handle();
00092 while (vv_it)
00093 {
00094 v2 = v3;
00095 v3 = (++vv_it).handle();
00096
00097
00098 if (mesh_.face_handle(vv_it.current_halfedge_handle()).is_valid())
00099 {
00100 if (v2 != _ci.v1 && v3 != _ci.v1)
00101 {
00102 r = roundness(_ci.p1, mesh_.point(v2), mesh_.point(v3));
00103 if (r < rmin) rmin = r;
00104 }
00105 }
00106 }
00107
00108
00109 if (Base::is_binary())
00110 {
00111 return (rmin > min_roundness_) ? 0.0f : -1.0f;
00112 }
00113 else
00114 {
00115 return (rmin > min_roundness_) ? 1.0f - rmin : -1.0f;
00116 }
00117 }
00118
00119
00120
00124 void set_min_roundness( Scalar _min_roundness )
00125 {
00126 assert( 0.0 <= _min_roundness && _min_roundness <= 1.0 );
00127 min_roundness_ = _min_roundness;
00128 }
00129
00130
00131
00132
00133 Scalar roundness(const Point& _v0, const Point& _v1, const Point& _v2) const
00134 {
00135 const double FOUR_ROOT3 = 6.928203230275509;
00136 const double area = 0.5*((_v1-_v0)%(_v2-_v0)).norm();
00137 return (Scalar) (FOUR_ROOT3 * area / ((_v0-_v1).sqrnorm() +
00138 (_v1-_v2).sqrnorm() +
00139 (_v2-_v0).sqrnorm() ));
00140 }
00141
00142
00143
00144 private:
00145
00146 Mesh& mesh_;
00147 Scalar min_roundness_;
00148 };
00149
00150
00151
00152 }
00153 }
00154
00155 #endif // OPENMESH_TOOLS_PROGMESHT_HH defined
00156
00157