mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-20 03:16:10 +00:00
Added Colorizing to principal curvature filter
This commit is contained in:
parent
986bd8395e
commit
2bf2a13398
@ -231,36 +231,36 @@ break;
|
||||
}
|
||||
|
||||
case CP_DISCRETE_CURVATURE:
|
||||
{
|
||||
m.updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_VERTCURV);
|
||||
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
|
||||
tri::UpdateFlags<CMeshO>::FaceBorderFromFF(m.cm);
|
||||
{
|
||||
m.updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_VERTCURV);
|
||||
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
|
||||
tri::UpdateFlags<CMeshO>::FaceBorderFromFF(m.cm);
|
||||
|
||||
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) > 0) {
|
||||
errorMessage = "Mesh has some not 2-manifold faces, Curvature computation requires manifoldness"; // text
|
||||
return false; // can't continue, mesh can't be processed
|
||||
}
|
||||
|
||||
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
|
||||
if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert);
|
||||
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
|
||||
tri::UpdateCurvature<CMeshO>::MeanAndGaussian(m.cm);
|
||||
int curvType = par.getEnum("CurvatureType");
|
||||
|
||||
switch(curvType){
|
||||
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvature(m.cm); Log( "Computed Mean Curvature"); break;
|
||||
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvature(m.cm); Log( "Computed Gaussian Curvature"); break;
|
||||
case 2: tri::UpdateQuality<CMeshO>::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break;
|
||||
case 3: tri::UpdateQuality<CMeshO>::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break;
|
||||
default : assert(0);
|
||||
}
|
||||
|
||||
Histogramf H;
|
||||
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
|
||||
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
break;
|
||||
}
|
||||
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) > 0) {
|
||||
errorMessage = "Mesh has some not 2-manifold faces, Curvature computation requires manifoldness"; // text
|
||||
return false; // can't continue, mesh can't be processed
|
||||
}
|
||||
|
||||
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
|
||||
if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert);
|
||||
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
|
||||
tri::UpdateCurvature<CMeshO>::MeanAndGaussian(m.cm);
|
||||
int curvType = par.getEnum("CurvatureType");
|
||||
|
||||
switch(curvType){
|
||||
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvatureHG(m.cm); Log( "Computed Mean Curvature"); break;
|
||||
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureHG(m.cm); Log( "Computed Gaussian Curvature"); break;
|
||||
case 2: tri::UpdateQuality<CMeshO>::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break;
|
||||
case 3: tri::UpdateQuality<CMeshO>::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break;
|
||||
default : assert(0);
|
||||
}
|
||||
|
||||
Histogramf H;
|
||||
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
|
||||
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
break;
|
||||
}
|
||||
case CP_TRIANGLE_QUALITY:
|
||||
{
|
||||
m.updateDataMask(MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY);
|
||||
@ -402,9 +402,10 @@ MeshFilterInterface::FilterClass ExtraMeshColorizePlugin::getClass(QAction *a){
|
||||
case CP_SATURATE_QUALITY:
|
||||
case CP_CLAMP_QUALITY:
|
||||
return MeshFilterInterface::Quality;
|
||||
case CP_DISCRETE_CURVATURE:
|
||||
return FilterClass(Normal + VertexColoring);
|
||||
|
||||
case CP_MAP_VQUALITY_INTO_COLOR:
|
||||
case CP_DISCRETE_CURVATURE:
|
||||
case CP_COLOR_NON_TOPO_COHERENT:
|
||||
case CP_VERTEX_SMOOTH:
|
||||
case CP_FACE_TO_VERTEX:
|
||||
|
||||
@ -107,7 +107,7 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
|
||||
case FP_REMOVE_UNREFERENCED_VERTEX :
|
||||
case FP_REMOVE_DUPLICATED_VERTEX :return MeshFilterInterface::Cleaning;
|
||||
case FP_SELECT_FACES_BY_AREA :
|
||||
case FP_SELECT_FACES_BY_EDGE : return MeshFilterInterface::FilterClass(MeshFilterInterface::Cleaning + MeshFilterInterface::Selection);
|
||||
case FP_SELECT_FACES_BY_EDGE : return FilterClass(Cleaning + Selection);
|
||||
|
||||
case FP_BUTTERFLY_SS :
|
||||
case FP_LOOP_SS :
|
||||
@ -123,14 +123,13 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
|
||||
case FP_REFINE_HALF_CATMULL :
|
||||
case FP_QUAD_DOMINANT :
|
||||
case FP_MAKE_PURE_TRI :
|
||||
case FP_QUAD_PAIRING :return MeshFilterInterface::FilterClass(MeshFilterInterface::Remeshing+MeshFilterInterface::Polygonal);
|
||||
case FP_QUAD_PAIRING :return FilterClass(Remeshing+Polygonal);
|
||||
|
||||
case FP_NORMAL_EXTRAPOLATION : return MeshFilterInterface::FilterClass( MeshFilterInterface::Normal + MeshFilterInterface::PointSet );
|
||||
case FP_NORMAL_SMOOTH_POINTCLOUD : return MeshFilterInterface::FilterClass( MeshFilterInterface::Normal + MeshFilterInterface::PointSet );
|
||||
case FP_NORMAL_EXTRAPOLATION : return FilterClass( Normal + PointSet );
|
||||
case FP_NORMAL_SMOOTH_POINTCLOUD : return FilterClass( Normal + PointSet );
|
||||
|
||||
case FP_INVERT_FACES :
|
||||
case FP_REORIENT :
|
||||
case FP_COMPUTE_PRINC_CURV_DIR :
|
||||
case FP_ROTATE :
|
||||
case FP_ROTATE_FIT :
|
||||
case FP_CENTER :
|
||||
@ -138,8 +137,10 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
|
||||
case FP_PRINCIPAL_AXIS :
|
||||
case FP_FLIP_AND_SWAP : return MeshFilterInterface::Normal;
|
||||
|
||||
case FP_COMPUTE_PRINC_CURV_DIR : return FilterClass( Normal + VertexColoring );
|
||||
|
||||
case FP_FREEZE_TRANSFORM :
|
||||
case FP_RESET_TRANSFORM : return FilterClass(MeshFilterInterface::Normal + MeshFilterInterface::Layer);
|
||||
case FP_RESET_TRANSFORM : return FilterClass(Normal + Layer);
|
||||
case FP_SLICE_WITH_A_PLANE : return MeshFilterInterface::Measure;
|
||||
|
||||
case FP_CYLINDER_UNWRAP : return MeshFilterInterface::Smoothing;
|
||||
@ -328,7 +329,10 @@ void ExtraMeshFilterPlugin::initParameterSet(QAction * action, MeshModel & m, Ri
|
||||
methods.push_back("Normal Cycles");
|
||||
methods.push_back("Pseudoinverse Quadric Fitting");
|
||||
parlst.addParam(new RichEnum("Method", 3, methods, tr("Method:"), tr("Choose a method")));
|
||||
parlst.addParam(new RichEnum("CurvatureType", 0, QStringList()<<"Mean Curvature"<<"Gaussian Curvature"<<"None", tr("Color Mapping"),
|
||||
QString("Choose the curvature that is mapped into quality and visualized as per vertex color.")));
|
||||
parlst.addParam(new RichBool("Autoclean",true,"Remove Unreferenced Vertices","If selected, before starting the filter will remove anyy unreference vertex (for which curvature values are not defined)"));
|
||||
|
||||
break;
|
||||
|
||||
case FP_QUADRIC_SIMPLIFICATION:
|
||||
@ -1207,28 +1211,43 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction * filter, MeshDocument & md, Ric
|
||||
} break;
|
||||
|
||||
|
||||
case FP_COMPUTE_PRINC_CURV_DIR:
|
||||
{
|
||||
m.updateDataMask(MeshModel::MM_VERTFACETOPO | MeshModel::MM_FACEFACETOPO);
|
||||
m.updateDataMask(MeshModel::MM_VERTCURV | MeshModel::MM_VERTCURVDIR);
|
||||
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) >0 ) {
|
||||
errorMessage = "Mesh has some not 2-manifold faces, cannot compute principal curvature directions"; // text
|
||||
return false; // can't continue, mesh can't be processed
|
||||
}
|
||||
tri::UpdateNormal<CMeshO>::NormalizePerVertex(m.cm);
|
||||
if(par.getBool("Autoclean")){
|
||||
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
|
||||
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
|
||||
Log( "Removed %d unreferenced vertices",delvert);
|
||||
}
|
||||
switch(par.getEnum("Method")){
|
||||
case 0: tri::UpdateCurvature<CMeshO>::PrincipalDirections(m.cm); break;
|
||||
case 1: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break;
|
||||
case 2: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsNormalCycle(m.cm); break;
|
||||
case 3: tri::UpdateCurvatureFitting<CMeshO>::computeCurvature(m.cm); break;
|
||||
default:assert(0);break;
|
||||
}
|
||||
} break;
|
||||
case FP_COMPUTE_PRINC_CURV_DIR:
|
||||
{
|
||||
m.updateDataMask(MeshModel::MM_VERTFACETOPO | MeshModel::MM_FACEFACETOPO);
|
||||
m.updateDataMask(MeshModel::MM_VERTCURV | MeshModel::MM_VERTCURVDIR);
|
||||
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
|
||||
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) >0 ) {
|
||||
errorMessage = "Mesh has some not 2-manifold faces, cannot compute principal curvature directions"; // text
|
||||
return false; // can't continue, mesh can't be processed
|
||||
}
|
||||
tri::UpdateNormal<CMeshO>::NormalizePerVertex(m.cm);
|
||||
if(par.getBool("Autoclean")){
|
||||
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
|
||||
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
|
||||
Log( "Removed %d unreferenced vertices",delvert);
|
||||
}
|
||||
switch(par.getEnum("Method")){
|
||||
case 0: tri::UpdateCurvature<CMeshO>::PrincipalDirections(m.cm); break;
|
||||
case 1: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break;
|
||||
case 2: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsNormalCycle(m.cm); break;
|
||||
case 3: tri::UpdateCurvatureFitting<CMeshO>::computeCurvature(m.cm); break;
|
||||
default:assert(0);break;
|
||||
}
|
||||
switch(par.getEnum("CurvatureType"))
|
||||
{
|
||||
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvatureDir (m.cm); break;
|
||||
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureDir(m.cm); break;
|
||||
case 2: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureDir(m.cm); break;
|
||||
}
|
||||
|
||||
Histogramf H;
|
||||
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
|
||||
if(par.getEnum("CurvatureType")!=2)
|
||||
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
|
||||
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
|
||||
|
||||
} break;
|
||||
|
||||
case FP_CLOSE_HOLES:
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user