From d7e581cf96dc169f5974a432201eea94daf6ffee Mon Sep 17 00:00:00 2001 From: nicopietroni Date: Tue, 16 Oct 2012 15:30:58 +0000 Subject: [PATCH] first release version --- wrap/miq/stiffening.h | 168 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 wrap/miq/stiffening.h diff --git a/wrap/miq/stiffening.h b/wrap/miq/stiffening.h new file mode 100644 index 00000000..3beb7276 --- /dev/null +++ b/wrap/miq/stiffening.h @@ -0,0 +1,168 @@ +#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")); + + for(unsigned int i=0;istiffening=1; + Handle_Stiffness[f]=1; + } + } + +}; + +#endif