added VertexCoordPlanarLaplacian that moves only the vertices that does not change the orientation of the incident faces. Very useful for creating good meshing of CAD models.

This commit is contained in:
Paolo Cignoni 2008-07-15 07:10:31 +00:00
parent 7053bdabf0
commit 2472215e8d
1 changed files with 54 additions and 1 deletions

View File

@ -340,6 +340,58 @@ static void VertexCoordLaplacian(MeshType &m, int step, bool SmoothSelected=fals
} }
} }
// Same of above but moves only the vertices that do not change FaceOrientation more that the given threshold
static void VertexCoordPlanarLaplacian(MeshType &m, int step, float AngleThrRad = math::ToRad(1.0), bool SmoothSelected=false, vcg::CallBackPos * cb=0)
{
VertexIterator vi;
FaceIterator fi;
LaplacianInfo lpz(CoordType(0,0,0),0);
SimpleTempData<typename MeshType::VertContainer,LaplacianInfo > TD(m.vert,lpz);
for(int i=0;i<step;++i)
{
if(cb)cb(100*i/step, "Planar Laplacian Smoothing");
TD.Init(lpz);
AccumulateLaplacianInfo(m,TD);
for(vi=m.vert.begin();vi!=m.vert.end();++vi)
if(!(*vi).IsD() && TD[*vi].cnt>0 )
{
if(!SmoothSelected || (*vi).IsS())
TD[*vi].sum = ( (*vi).P() + TD[*vi].sum)/(TD[*vi].cnt+1);
}
for(fi=m.face.begin();fi!=m.face.end();++fi){
if(!(*fi).IsD()){
for (int j = 0; j < 3; ++j) {
if(Angle( NormalizedNormal(TD[(*fi).V0(j)].sum, (*fi).P1(j), (*fi).P2(j) ),
NormalizedNormal( (*fi).P0(j) , (*fi).P1(j), (*fi).P2(j) ) ) > AngleThrRad )
TD[(*fi).V0(j)].sum = (*fi).P0(j);
}
}
}
for(fi=m.face.begin();fi!=m.face.end();++fi){
if(!(*fi).IsD()){
for (int j = 0; j < 3; ++j) {
if(Angle( NormalizedNormal(TD[(*fi).V0(j)].sum, TD[(*fi).V1(j)].sum, (*fi).P2(j) ),
NormalizedNormal( (*fi).P0(j) , (*fi).P1(j), (*fi).P2(j) ) ) > AngleThrRad )
{
TD[(*fi).V0(j)].sum = (*fi).P0(j);
TD[(*fi).V1(j)].sum = (*fi).P1(j);
}
}
}
}
for(vi=m.vert.begin();vi!=m.vert.end();++vi)
if(!(*vi).IsD() && TD[*vi].cnt>0 )
(*vi).P()= TD[*vi].sum;
}// end step
}
static void VertexCoordLaplacianBlend(MeshType &m, int step, float alpha, bool SmoothSelected=false) static void VertexCoordLaplacianBlend(MeshType &m, int step, float alpha, bool SmoothSelected=false)
{ {
VertexIterator vi; VertexIterator vi;
@ -516,7 +568,7 @@ public:
int cnt; int cnt;
}; };
static void VertexColorLaplacian(MeshType &m, int step, bool SmoothSelected=false) static void VertexColorLaplacian(MeshType &m, int step, bool SmoothSelected=false, vcg::CallBackPos * cb=0)
{ {
ColorSmoothInfo csi; ColorSmoothInfo csi;
csi.r=0; csi.g=0; csi.b=0; csi.cnt=0; csi.r=0; csi.g=0; csi.b=0; csi.cnt=0;
@ -524,6 +576,7 @@ static void VertexColorLaplacian(MeshType &m, int step, bool SmoothSelected=fals
for(int i=0;i<step;++i) for(int i=0;i<step;++i)
{ {
if(cb) cb(100*i/step, "Vertex Color Laplacian Smoothing");
VertexIterator vi; VertexIterator vi;
for(vi=m.vert.begin();vi!=m.vert.end();++vi) for(vi=m.vert.begin();vi!=m.vert.end();++vi)
TD[*vi]=csi; TD[*vi]=csi;