added one more parameter in SmoothPCA to ignore some faces in the computation

This commit is contained in:
nico 2020-05-15 10:02:30 +10:00
parent d223c497cd
commit f2ce7bdf69
1 changed files with 13 additions and 2 deletions

View File

@ -507,7 +507,8 @@ public:
bool isotropic=true, bool isotropic=true,
ScalarType smoothTerm=0.1, ScalarType smoothTerm=0.1,
bool fixB=true, bool fixB=true,
bool WeightByQuality=false) bool WeightByQuality=false,
const std::vector<bool> *IgnoreF=NULL)
{ {
(void)isotropic; (void)isotropic;
typedef typename PolyMeshType::FaceType PolygonType; typedef typename PolyMeshType::FaceType PolygonType;
@ -524,6 +525,7 @@ public:
if (WeightByQuality) if (WeightByQuality)
UpdateQuality(poly_m,QTemplate); UpdateQuality(poly_m,QTemplate);
if (IgnoreF!=NULL){assert((*IgnoreF).size()==poly_m.face.size());}
for (size_t s=0;s<(size_t)relax_step;s++) for (size_t s=0;s<(size_t)relax_step;s++)
{ {
//initialize the accumulation vector //initialize the accumulation vector
@ -533,6 +535,7 @@ public:
for (size_t i=0;i<poly_m.face.size();i++) for (size_t i=0;i<poly_m.face.size();i++)
{ {
if ((IgnoreF!=NULL)&&((*IgnoreF)[i]))continue;
std::vector<typename PolygonType::CoordType> TemplatePos; std::vector<typename PolygonType::CoordType> TemplatePos;
GetRotatedTemplatePos(poly_m.face[i],TemplatePos); GetRotatedTemplatePos(poly_m.face[i],TemplatePos);
//then cumulate the position per vertex //then cumulate the position per vertex
@ -566,7 +569,15 @@ public:
// if (alpha<0)alpha=0; // if (alpha<0)alpha=0;
// if (alpha>1)alpha=1; // if (alpha>1)alpha=1;
// if (isnan(alpha))alpha=1; // if (isnan(alpha))alpha=1;
CoordType newP=avgPos[i]/weightSum[i];
CoordType newP=poly_m.vert[i].P();
//safety checks
if (weightSum[i]>0)
newP=avgPos[i]/weightSum[i];
if (isnan(newP.X())||isnan(newP.Y())||isnan(newP.Z()))
newP=poly_m.vert[i].P();
if ((newP-poly_m.vert[i].P()).Norm()>poly_m.bbox.Diag())
newP=poly_m.vert[i].P();
//std::cout<<"W "<<weightSum[i]<<std::endl; //std::cout<<"W "<<weightSum[i]<<std::endl;
newP=newP*(1-alpha)+AvVert[i]*alpha; newP=newP*(1-alpha)+AvVert[i]*alpha;
//newP=AvVert[i]; //newP=AvVert[i];