added VertexQualityTaubin function
This commit is contained in:
parent
ee9c389418
commit
8c2dcdffe8
|
@ -401,6 +401,44 @@ static void VertexCoordTaubin(MeshType &m, int step, float lambda, float mu, boo
|
||||||
} // end for step
|
} // end for step
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void VertexQualityTaubin(MeshType &m, int step, float lambda, float mu, bool SmoothSelected=false, vcg::CallBackPos * cb=0)
|
||||||
|
{
|
||||||
|
SimpleTempData<typename MeshType::VertContainer,ScalarType > OldQ(m.vert,0);
|
||||||
|
|
||||||
|
VertexIterator vi;
|
||||||
|
for(int i=0;i<step;++i)
|
||||||
|
{
|
||||||
|
for (size_t i=0;i<m.vert.size();i++)
|
||||||
|
OldQ[i]=m.vert[i].Q();
|
||||||
|
|
||||||
|
if(cb) cb(100*i/step, "Taubin Smoothing");
|
||||||
|
|
||||||
|
VertexQualityLaplacian(m,1,SmoothSelected);
|
||||||
|
|
||||||
|
for(vi=m.vert.begin();vi!=m.vert.end();++vi)
|
||||||
|
{
|
||||||
|
if(!SmoothSelected || (*vi).IsS())
|
||||||
|
{
|
||||||
|
ScalarType Delta = (*vi).Q() - OldQ[(*vi)];
|
||||||
|
(*vi).Q() = OldQ[(*vi)] + Delta*lambda ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i=0;i<m.vert.size();i++)
|
||||||
|
OldQ[i]=m.vert[i].Q();
|
||||||
|
VertexQualityLaplacian(m,1,SmoothSelected);
|
||||||
|
|
||||||
|
for(vi=m.vert.begin();vi!=m.vert.end();++vi)
|
||||||
|
{
|
||||||
|
if(!SmoothSelected || (*vi).IsS())
|
||||||
|
{
|
||||||
|
ScalarType Delta = m.vert[i].Q() - OldQ[(*vi)];
|
||||||
|
(*vi).Q() = OldQ[(*vi)] + Delta*mu ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // end for step
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void VertexCoordLaplacianQuality(MeshType &m, int step, bool SmoothSelected=false)
|
static void VertexCoordLaplacianQuality(MeshType &m, int step, bool SmoothSelected=false)
|
||||||
{
|
{
|
||||||
|
@ -689,7 +727,7 @@ static void VertexQualityLaplacian(MeshType &m, int step=1, bool SmoothSelected=
|
||||||
FaceIterator fi;
|
FaceIterator fi;
|
||||||
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
if(!(*fi).IsD())
|
if(!(*fi).IsD())
|
||||||
for(int j=0;j<3;++j)
|
for(int j=0;j<(*fi).VN();++j)
|
||||||
if(!(*fi).IsB(j))
|
if(!(*fi).IsB(j))
|
||||||
{
|
{
|
||||||
TD[(*fi).V(j)].sum+=(*fi).V1(j)->Q();
|
TD[(*fi).V(j)].sum+=(*fi).V1(j)->Q();
|
||||||
|
@ -701,7 +739,7 @@ static void VertexQualityLaplacian(MeshType &m, int step=1, bool SmoothSelected=
|
||||||
// si azzaera i dati per i vertici di bordo
|
// si azzaera i dati per i vertici di bordo
|
||||||
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
if(!(*fi).IsD())
|
if(!(*fi).IsD())
|
||||||
for(int j=0;j<3;++j)
|
for(int j=0;j<(*fi).VN();++j)
|
||||||
if((*fi).IsB(j))
|
if((*fi).IsB(j))
|
||||||
{
|
{
|
||||||
TD[(*fi).V(j)]=lpz;
|
TD[(*fi).V(j)]=lpz;
|
||||||
|
@ -711,7 +749,7 @@ static void VertexQualityLaplacian(MeshType &m, int step=1, bool SmoothSelected=
|
||||||
// se l'edge j e' di bordo si deve mediare solo con gli adiacenti
|
// se l'edge j e' di bordo si deve mediare solo con gli adiacenti
|
||||||
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
if(!(*fi).IsD())
|
if(!(*fi).IsD())
|
||||||
for(int j=0;j<3;++j)
|
for(int j=0;j<(*fi).VN();++j)
|
||||||
if((*fi).IsB(j))
|
if((*fi).IsB(j))
|
||||||
{
|
{
|
||||||
TD[(*fi).V(j)].sum+=(*fi).V1(j)->Q();
|
TD[(*fi).V(j)].sum+=(*fi).V1(j)->Q();
|
||||||
|
|
Loading…
Reference in New Issue