diff --git a/vcg/complex/algorithms/point_sampling.h b/vcg/complex/algorithms/point_sampling.h index f7275dfc..522a693b 100644 --- a/vcg/complex/algorithms/point_sampling.h +++ b/vcg/complex/algorithms/point_sampling.h @@ -848,27 +848,33 @@ static void EdgeMeshUniform(MeshType &m, VertexSampler &ps, float radius, bool c /// static void VertexBorderCorner(MeshType & m, VertexSampler &ps, float angleRad) { - typename MeshType::template PerVertexAttributeHandle angleSumH = tri::Allocator:: template GetPerVertexAttribute (m); +// typename MeshType::template PerVertexAttributeHandle angleSumH = tri::Allocator:: template GetPerVertexAttribute (m); - for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) - angleSumH[vi]=0; +// for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) +// angleSumH[vi]=0; - for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) - { - for(int i=0;i<3;++i) +// for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) +// { +// for(int i=0;i<3;++i) +// { +// angleSumH[fi->V(i)] += vcg::Angle(fi->P2(i) - fi->P0(i),fi->P1(i) - fi->P0(i)); +// } +// } + +// for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) +// { +// if((angleSumH[vi]IsB())|| +// (angleSumH[vi]>(360-angleRad) && vi->IsB())) +// ps.AddVert(*vi); +// } + +// tri::Allocator:: template DeletePerVertexAttribute (m,angleSumH); + vcg::tri::UpdateFlags::FaceClearS(m); + vcg::tri::UpdateFlags::SelectVertexCornerBorder(m,angleRad); + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) { - angleSumH[fi->V(i)] += vcg::Angle(fi->P2(i) - fi->P0(i),fi->P1(i) - fi->P0(i)); + if(vi->IsS())ps.AddVert(*vi); } - } - - for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) - { - if((angleSumH[vi]IsB())|| - (angleSumH[vi]>(360-angleRad) && vi->IsB())) - ps.AddVert(*vi); - } - - tri::Allocator:: template DeletePerVertexAttribute (m,angleSumH); } /// \brief Sample all the border vertices diff --git a/vcg/complex/algorithms/update/flag.h b/vcg/complex/algorithms/update/flag.h index 4640577b..817ba662 100644 --- a/vcg/complex/algorithms/update/flag.h +++ b/vcg/complex/algorithms/update/flag.h @@ -443,6 +443,36 @@ public: FaceFauxSignedCrease(m,-AngleRad,AngleRad); } + /// \brief Select the border vertices that form a corner along the boder + /// with an angle that is below a certain threshold + static void SelectVertexCornerBorder(MeshType &m,typename MeshType::ScalarType &angleRad) + { + typedef typename MeshType::ScalarType ScalarType; + + //get corner vertices + typename MeshType::template PerVertexAttributeHandle angleSumH = tri::Allocator:: template GetPerVertexAttribute (m); + + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) + angleSumH[vi]=0; + + for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) + { + for(int i=0;i<(*fi).VN();++i) + { + typename MeshType::CoordType P0=fi->P(i); + typename MeshType::CoordType P1=fi->P((i+1)%(*fi).VN()); + typename MeshType::CoordType P2=fi->P((i+2)%(*fi).VN()); + angleSumH[fi->V(i)] += vcg::Angle(P2 - P0,P1 - P0); + } + } + + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) + { + if(angleSumH[vi]IsB()) + (*vi).SetS(); + } + } + }; // end class } // End namespace tri