diff --git a/src/meshlabplugins/filter_meshing/meshfilter.cpp b/src/meshlabplugins/filter_meshing/meshfilter.cpp index 5013893fd..96d674782 100644 --- a/src/meshlabplugins/filter_meshing/meshfilter.cpp +++ b/src/meshlabplugins/filter_meshing/meshfilter.cpp @@ -323,7 +323,7 @@ QString ExtraMeshFilterPlugin::filterInfo(ActionIDType filterID) const case FP_SET_TRANSFORM_MATRIX : return tr("Set the current transformation matrix by filling it, or copying from another layer."); case FP_NORMAL_EXTRAPOLATION : return tr("Compute the normals of the vertices of a mesh without exploiting the triangle connectivity, useful for dataset with no faces"); case FP_NORMAL_SMOOTH_POINTCLOUD : return tr("Smooth the normals of the vertices of a mesh without exploiting the triangle connectivity, useful for dataset with no faces"); - case FP_COMPUTE_PRINC_CURV_DIR : return tr("Compute the principal directions of curvature with several algorithms"); + case FP_COMPUTE_PRINC_CURV_DIR : return tr("Compute the principal directions of curvature with different algorithms"); case FP_CLOSE_HOLES : return tr("Close holes smaller than a given threshold"); case FP_CYLINDER_UNWRAP : return tr("Unwrap the geometry of current mesh along a clylindrical equatorial projection. The cylindrical projection axis is centered on the origin and directed along the vertical Y axis."); case FP_QUAD_PAIRING : return tr("Convert a tri-mesh into a quad mesh by pairing triangles."); @@ -361,13 +361,17 @@ RichParameterList ExtraMeshFilterPlugin::initParameterList(const QAction * actio switch(ID(action)) { case FP_COMPUTE_PRINC_CURV_DIR: + maxVal = m.cm.bbox.Diag(); curvCalcMethods.push_back("Taubin approximation"); curvCalcMethods.push_back("Principal Component Analysis"); curvCalcMethods.push_back("Normal Cycles"); - curvCalcMethods.push_back("Pseudoinverse Quadric Fitting"); + curvCalcMethods.push_back("Quadric Fitting"); + curvCalcMethods.push_back("Scale Dependent Quadric Fitting"); curvColorMethods << "Mean Curvature"<<"Gaussian Curvature"<<"Min Curvature"<<"Max Curvature" << "Shape Index"<< "CurvedNess" <<"None"; parlst.addParam(RichEnum("Method", 3, curvCalcMethods, tr("Method:"), tr("Choose a method"))); parlst.addParam(RichEnum("CurvColorMethod", 0, curvColorMethods, tr("Quality/Color Mapping"), QString("Choose the curvature that is mapped into quality and visualized as per vertex color."))); + parlst.addParam(RichAbsPerc("Scale",maxVal*0.1,0,maxVal,"Curvature Scale","This parameter is used only for scale dependent methods: 'Scale Dependent Quadric Fitting' and 'PCA'." + " It specifies the scale at which the curvature is computed. e.g. for SDQF it specify how large is the patch where we fit the quadric used to compute curvature dirs.")); parlst.addParam(RichBool("Autoclean",true,"Remove Unreferenced Vertices","If selected, before starting the filter will remove any unreference vertex (for which curvature values are not defined)")); break; @@ -1309,6 +1313,7 @@ std::map ExtraMeshFilterPlugin::applyFilter( case FP_COMPUTE_PRINC_CURV_DIR: { + float CurvatureScale = par.getAbsPerc("Scale"); m.updateDataMask(MeshModel::MM_VERTFACETOPO | MeshModel::MM_FACEFACETOPO); m.updateDataMask(MeshModel::MM_VERTCURV | MeshModel::MM_VERTCURVDIR); m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY); @@ -1324,9 +1329,10 @@ std::map ExtraMeshFilterPlugin::applyFilter( switch(par.getEnum("Method")) { case 0: tri::UpdateCurvature::PrincipalDirections(m.cm); break; - case 1: tri::UpdateCurvature::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break; + case 1: tri::UpdateCurvature::PrincipalDirectionsPCA(m.cm,CurvatureScale,true,cb); break; case 2: tri::UpdateCurvature::PrincipalDirectionsNormalCycle(m.cm); break; - case 3: tri::UpdateCurvatureFitting::computeCurvature(m.cm); break; + case 3: tri::UpdateCurvatureFitting::computeCurvature(m.cm); break; + case 4: tri::UpdateCurvatureFitting::updateCurvatureLocal(m.cm,CurvatureScale,cb); break; default:assert(0);break; } switch(par.getEnum("CurvColorMethod"))