00001 #include <algorithm>
00002 #include <OpenMesh/Core/Utils/Property.hh>
00003
00004 #ifndef DOXY_IGNORE_THIS
00005
00006 template <class Mesh> class SmootherT
00007 {
00008 public:
00009
00010 typedef typename Mesh::Point cog_t;
00011 typedef OpenMesh::VPropHandleT< cog_t > Property_cog;
00012
00013 public:
00014
00015
00016 SmootherT(Mesh& _mesh)
00017 : mesh_(_mesh)
00018 {
00019 mesh_.add_property( cog_ );
00020 }
00021
00022 ~SmootherT()
00023 {
00024 mesh_.remove_property( cog_ );
00025 }
00026
00027
00028 void smooth(unsigned int _iterations)
00029 {
00030 for (unsigned int i=0; i < _iterations; ++i)
00031 {
00032 std::for_each(mesh_.vertices_begin(),
00033 mesh_.vertices_end(),
00034 ComputeCOG(mesh_, cog_));
00035
00036 std::for_each(mesh_.vertices_begin(),
00037 mesh_.vertices_end(),
00038 SetCOG(mesh_, cog_));
00039 }
00040 }
00041
00042
00043 private:
00044
00045
00046
00047
00048 class ComputeCOG
00049 {
00050 public:
00051 ComputeCOG(Mesh& _mesh, Property_cog& _cog)
00052 : mesh_(_mesh), cog_(_cog)
00053 {}
00054
00055 void operator()(typename Mesh::Vertex& _v)
00056 {
00057 typename Mesh::VertexHandle vh( mesh_.handle(_v) );
00058 typename Mesh::VertexVertexIter vv_it;
00059 typename Mesh::Scalar valence(0.0);
00060
00061 mesh_.property(cog_, vh) = typename Mesh::Point(0.0, 0.0, 0.0);
00062
00063 for (vv_it=mesh_.vv_iter(vh); vv_it; ++vv_it)
00064 {
00065 mesh_.property(cog_, vh) += mesh_.point( vv_it );
00066 ++valence;
00067 }
00068
00069 mesh_.property(cog_, mesh_.handle(_v) ) /= valence;
00070 }
00071
00072 private:
00073 Mesh& mesh_;
00074 Property_cog& cog_;
00075 };
00076
00077
00078 class SetCOG
00079 {
00080 public:
00081 SetCOG(Mesh& _mesh, Property_cog& _cog)
00082 : mesh_(_mesh), cog_(_cog)
00083 {}
00084
00085 void operator()(typename Mesh::Vertex& _v)
00086 {
00087 typename Mesh::VertexHandle vh(mesh_.handle(_v));
00088
00089 if (!mesh_.is_boundary(vh))
00090 mesh_.set_point( vh, mesh_.property(cog_, vh) );
00091 }
00092
00093 private:
00094
00095 Mesh& mesh_;
00096 Property_cog& cog_;
00097 };
00098
00099
00100
00101
00102 Mesh& mesh_;
00103 Property_cog cog_;
00104 };
00105
00106 #endif