diff --git a/apps/sample/trimesh_base/CMakeLists.txt b/apps/sample/trimesh_base/CMakeLists.txt new file mode 100644 index 00000000..8939a675 --- /dev/null +++ b/apps/sample/trimesh_base/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required... +set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11 +project (trimesh_base) +add_executable(trimesh_base trimesh_base.cpp) +include_directories(../../..) +include_directories(../../../eigenlib) diff --git a/vcg/complex/algorithms/update/quality.h b/vcg/complex/algorithms/update/quality.h index c8d88908..51d27c94 100644 --- a/vcg/complex/algorithms/update/quality.h +++ b/vcg/complex/algorithms/update/quality.h @@ -46,17 +46,20 @@ class UpdateQuality public: typedef UpdateMeshType MeshType; typedef typename MeshType::ScalarType ScalarType; + typedef typename MeshType::CoordType CoordType; typedef typename MeshType::VertexType VertexType; typedef typename MeshType::VertexPointer VertexPointer; typedef typename MeshType::VertexIterator VertexIterator; typedef typename MeshType::FaceType FaceType; typedef typename MeshType::FacePointer FacePointer; typedef typename MeshType::FaceIterator FaceIterator; + typedef typename MeshType::VertexType::QualityType VertexQualityType; + typedef typename MeshType::FaceType::QualityType FaceQualityType; /** Assign to each vertex of the mesh a constant quality value. Useful for initialization. */ -static void VertexConstant(MeshType &m, ScalarType q) +static void VertexConstant(MeshType &m, VertexQualityType q) { tri::RequirePerVertexQuality(m); for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) if(!(*vi).IsD()) @@ -83,8 +86,8 @@ static void VertexValence(UpdateMeshType &m) /** Clamp each vertex of the mesh with a range of values. */ static void VertexClamp(MeshType &m, - typename MeshType::VertexType::QualityType qmin, - typename MeshType::VertexType::QualityType qmax) + VertexQualityType qmin, + VertexQualityType qmax) { tri::RequirePerVertexQuality(m); for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) if(!(*vi).IsD()) @@ -93,7 +96,7 @@ static void VertexClamp(MeshType &m, /** Normalize the vertex quality so that it fits in the specified range. */ -static void VertexNormalize(MeshType &m, float qmin=0.0, float qmax=1.0) +static void VertexNormalize(MeshType &m, VertexQualityType qmin=0.0, VertexQualityType qmax=1.0) { tri::RequirePerVertexQuality(m); ScalarType deltaRange = qmax-qmin; @@ -105,18 +108,18 @@ static void VertexNormalize(MeshType &m, float qmin=0.0, float qmax=1.0) /** Normalize the face quality so that it fits in the specified range. */ -static void FaceNormalize(MeshType &m, float qmin=0.0, float qmax=1.0) +static void FaceNormalize(MeshType &m, FaceQualityType qmin=0.0, FaceQualityType qmax=1.0) { tri::RequirePerFaceQuality(m); - ScalarType deltaRange = qmax-qmin; - std::pair minmax = tri::Stat::ComputePerFaceQualityMinMax(m); + FaceQualityType deltaRange = qmax-qmin; + std::pair minmax = tri::Stat::ComputePerFaceQualityMinMax(m); for(FaceIterator fi = m.face.begin(); fi != m.face.end(); ++fi) (*fi).Q() = qmin+deltaRange*((*fi).Q() - minmax.first)/(minmax.second - minmax.first); } /** Assign to each face of the mesh a constant quality value. Useful for initialization. */ -static void FaceConstant(MeshType &m, float q) +static void FaceConstant(MeshType &m, FaceQualityType q) { tri::RequirePerFaceQuality(m); for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) @@ -129,7 +132,7 @@ static void FaceArea(MeshType &m) { tri::RequirePerFaceQuality(m); for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) - (*fi).Q()=vcg::DoubleArea(*fi)/ScalarType(2.0); + (*fi).Q()=FaceQualityType(vcg::DoubleArea(*fi)/ScalarType(2.0)); } static void VertexFromFace( MeshType &m, bool areaWeighted=true) @@ -142,7 +145,7 @@ static void VertexFromFace( MeshType &m, bool areaWeighted=true) for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) if(!(*fi).IsD()) { - ScalarType weight=1.0; + VertexQualityType weight=1.0; if(areaWeighted) weight = vcg::DoubleArea(*fi); for(int j=0;j<3;++j) { @@ -163,14 +166,14 @@ static void VertexFromAttributeHandle(MeshType &m, typename MeshType::template P { for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) if(!(*vi).IsD()) - (*vi).Q()=ScalarType(h[vi]); + (*vi).Q()=VertexQualityType(h[vi]); } template static void FaceFromAttributeHandle(MeshType &m, typename MeshType::template PerFaceAttributeHandle &h) { for(FaceIterator fi=m.face.begin();fi!=m.face.end();++fi) if(!(*fi).IsD()) - (*fi).Q() =h[fi]; + (*fi).Q() =FaceQualityType(h[fi]); } static void FaceFromVertex( MeshType &m) @@ -182,7 +185,7 @@ static void FaceFromVertex( MeshType &m) (*fi).Q() =0; for (size_t i=0;i<(*fi).VN();i++) (*fi).Q() += (*fi).V(i)->Q(); - (*fi).Q()/=(ScalarType)(*fi).VN(); + (*fi).Q()/=(FaceQualityType)(*fi).VN(); } } @@ -303,14 +306,14 @@ static void VertexFromCurvednessCurvatureDir(MeshType &m) static void VertexFromAbsoluteCurvature(MeshType &m) { - VertexIterator vi; - for(vi=m.vert.begin();vi!=m.vert.end();++vi) if(!(*vi).IsD()) - { - if((*vi).Kg() >= 0) - (*vi).Q() = math::Abs( 2*(*vi).Kh() ); - else - (*vi).Q() = 2*math::Sqrt(math::Abs( (*vi).Kh()*(*vi).Kh() - (*vi).Kg())); - } + VertexIterator vi; + for(vi=m.vert.begin();vi!=m.vert.end();++vi) if(!(*vi).IsD()) + { + if((*vi).Kg() >= 0) + (*vi).Q() = math::Abs( 2*(*vi).Kh() ); + else + (*vi).Q() = 2*math::Sqrt(math::Abs( (*vi).Kh()*(*vi).Kh() - (*vi).Kg())); + } } /* @@ -333,11 +336,8 @@ static void VertexFromRMSCurvature(MeshType &m) Note: requires FF adjacency. */ -static void FaceSaturate(MeshType &m, ScalarType gradientThr=1.0) +static void FaceSaturate(MeshType &m, FaceQualityType gradientThr=1.0) { - typedef typename MeshType::CoordType CoordType; - typedef typename MeshType::ScalarType ScalarType; - UpdateFlags::FaceClearV(m); std::stack st; @@ -361,9 +361,9 @@ static void FaceSaturate(MeshType &m, ScalarType gradientThr=1.0) for(ffi=star.begin();ffi!=star.end();++ffi ) { assert(fc!=(*ffi)); - ScalarType &qi = (*ffi)->Q(); + FaceQualityType &qi = (*ffi)->Q(); CoordType bary1=((*ffi)->P(0)+(*ffi)->P(1)+(*ffi)->P(2))/3; - ScalarType distGeom = Distance(bary0,bary1) / gradientThr; + FaceQualityType distGeom = Distance(bary0,bary1) / gradientThr; // Main test if the quality varies more than the geometric displacement we have to lower something. if( distGeom < fabs(qi - fc->Q())) { @@ -382,7 +382,7 @@ static void FaceSaturate(MeshType &m, ScalarType gradientThr=1.0) // second case: you have to lower qi, the vertex under examination. assert( distGeom < fabs(qi - fc->Q())); assert(fc->Q() < qi); - float newQi = fc->Q() + distGeom -(ScalarType)0.00001; + FaceQualityType newQi = fc->Q() + distGeom -(FaceQualityType)0.00001; assert(newQi <= qi); assert(fc->Q() < newQi); assert( distGeom > fabs(newQi - fc->Q()) ); @@ -401,11 +401,12 @@ static void FaceSaturate(MeshType &m, ScalarType gradientThr=1.0) } } -/* - Saturate the vertex quality so that for each vertex the gradient of the quality is lower than the given threshold value (in absolute value) - The saturation is done in a conservative way (quality is always decreased and never increased) +/** \brief Saturate Vertex Quality + * Saturate the vertex quality so that for each vertex the gradient of the quality field + * is lower than the given threshold value (in absolute value) + * The saturation is done in a conservative way (quality is always decreased and never increased) - Note: requires VF adjacency. + * Note: requires VF adjacency. */ static void VertexSaturate(MeshType &m, ScalarType gradientThr=1.0) { @@ -422,11 +423,10 @@ static void VertexSaturate(MeshType &m, ScalarType gradientThr=1.0) st.pop(); vc->SetV(); std::vector star; - typename std::vector::iterator vvi; face::VVStarVF(vc,star); - for(vvi=star.begin();vvi!=star.end();++vvi ) + for(auto vvi=star.begin();vvi!=star.end();++vvi ) { - ScalarType &qi = (*vvi)->Q(); + ScalarType qi = (*vvi)->Q(); ScalarType distGeom = Distance((*vvi)->cP(),vc->cP()) / gradientThr; // Main test if the quality varies more than the geometric displacement we have to lower something. if( distGeom < fabs(qi - vc->Q())) @@ -436,8 +436,8 @@ static void VertexSaturate(MeshType &m, ScalarType gradientThr=1.0) if(vc->Q() > qi) // first case: the center of the star has to be lowered (and re-inserted in the queue). { //printf("Reinserting center %i \n",vc - &*m.vert.begin()); - ScalarType delta=std::min((ScalarType)0.00001,(ScalarType)distGeom/2.0); - vc->Q() = qi+distGeom-delta; + VertexQualityType delta=std::min(ScalarType(0.00001),ScalarType(distGeom/2.0)); + vc->Q() = VertexQualityType(qi+distGeom-delta); assert( distGeom > fabs(qi - vc->Q())); st.push(vc); break; @@ -447,8 +447,8 @@ static void VertexSaturate(MeshType &m, ScalarType gradientThr=1.0) // second case: you have to lower qi, the vertex under examination. assert( distGeom < fabs(qi - vc->Q())); assert(vc->Q() < qi); - ScalarType delta=std::min((ScalarType)0.00001,(ScalarType)distGeom/2.0); - float newQi = vc->Q() + distGeom -delta; + VertexQualityType delta=std::min(VertexQualityType(0.00001),VertexQualityType(distGeom/2.0)); + VertexQualityType newQi = vc->Q() + distGeom -delta; assert(newQi <= qi); assert(vc->Q() < newQi); assert( distGeom > fabs(newQi - vc->Q()) );