#ifndef MIQ_STIFFENING #define MIQ_STIFFENING template ScalarType Gauss(ScalarType &value) { const ScalarType E_NEPER=2.71828; const ScalarType den=sqrt(2.0*M_PI); ScalarType exponent=-0.5*pow(value,2); ScalarType res=((1.0/den)*pow(E_NEPER,exponent)); return res; } template class StiffeningInitializer { typedef typename MeshType::ScalarType ScalarType; typedef typename MeshType::FaceType FaceType; typedef typename MeshType::VertexType VertexType; typedef typename MeshType::CoordType CoordType; public: static void colorByStiffening(MeshType & mesh, typename MeshType::ScalarType MaxVal=16) { bool hasStiffness = vcg::tri::HasPerFaceAttribute(mesh,std::string("Stiffness")); assert(hasStiffness); typename MeshType::template PerFaceAttributeHandle Handle_Stiffness=vcg::tri::Allocator::template GetPerFaceAttribute(mesh,std::string("Stiffness")); for (unsigned int i=0;i Handle_Stiffness; bool hasStiffness = vcg::tri::HasPerFaceAttribute(mesh,std::string("Stiffness")); if(!hasStiffness) Handle_Stiffness=vcg::tri::Allocator::template AddPerFaceAttribute(mesh,std::string("Stiffness")); else Handle_Stiffness=vcg::tri::Allocator::template GetPerFaceAttribute(mesh,std::string("Stiffness")); bool hasSingular = vcg::tri::HasPerVertexAttribute(mesh,std::string("Singular")); assert(hasSingular); typename MeshType::template PerVertexAttributeHandle Handle_Singular; Handle_Singular=vcg::tri::Allocator::GetPerVertexAttribute(mesh,std::string("Singular")); std::vector to_stiff; for(unsigned int i=0;iIsD())continue; //if (!v->IsSingular())continue; if (!Handle_Singular[v])continue; to_stiff.push_back(v); } for(unsigned int i=0;iIsD())continue; if (!f->IsV())continue; to_stiff.push_back(f->V(0)); to_stiff.push_back(f->V(1)); to_stiff.push_back(f->V(2)); } std::sort(to_stiff.begin(),to_stiff.end()); typename std::vector::iterator new_end; new_end=std::unique(to_stiff.begin(),to_stiff.end()); int dist=distance(to_stiff.begin(),new_end); to_stiff.resize(dist); for (unsigned int i=0;i ring; //mesh.GetConnectedFaces(v,r,ring); VFExtendedStarVF(v,r,ring); ///then set stiffening for (unsigned int k=0;kstiffeningstiffening=stiffVal; if (Handle_Stiffness[f] Handle_Stiffness; bool hasStiffness = vcg::tri::HasPerFaceAttribute(mesh,std::string("Stiffness")); if(!hasStiffness) Handle_Stiffness=vcg::tri::Allocator::template AddPerFaceAttribute(mesh,std::string("Stiffness")); else Handle_Stiffness=vcg::tri::Allocator::template GetPerFaceAttribute(mesh,std::string("Stiffness")); bool flipped = NumFlips(mesh)>0; //if (h == 0.0) // return flipped; // //assert(h != 0.0); if (!flipped) return false; ScalarType maxL=0; ScalarType maxD=0; if (flipped) { const double c = 1.0; const double d = 5.0; for (unsigned int i = 0; i < mesh.face.size(); ++i) { ScalarType dist=Distortion(mesh.face[i],grad_size); if (dist>maxD)maxD=dist; ScalarType absLap=fabs(LaplaceDistortion(mesh.face[i], grad_size)); if (absLap>maxL)maxL=absLap; ScalarType stiffDelta = std::min(c * absLap, d); //mesh.face[i].stiffening+=stiffDelta; Handle_Stiffness[i]+=stiffDelta; } } printf("Maximum Distorsion %4.4f \n",maxD); printf("Maximum Laplacian %4.4f \n",maxL); return flipped; } static void InitDefaultStiffening(MeshType & mesh) { typename MeshType::template PerFaceAttributeHandle Handle_Stiffness; bool hasStiffness = vcg::tri::HasPerFaceAttribute(mesh,std::string("Stiffness")); if(!hasStiffness) Handle_Stiffness=vcg::tri::Allocator::template AddPerFaceAttribute(mesh,std::string("Stiffness")); else Handle_Stiffness=vcg::tri::Allocator::template GetPerFaceAttribute(mesh,std::string("Stiffness")); for(unsigned int i=0;istiffening=1; Handle_Stiffness[f]=1; } } }; #endif