diff --git a/src/meshlabplugins/filter_sampling/filter_sampling.cpp b/src/meshlabplugins/filter_sampling/filter_sampling.cpp index e8fdaadc4..1cf69f680 100644 --- a/src/meshlabplugins/filter_sampling/filter_sampling.cpp +++ b/src/meshlabplugins/filter_sampling/filter_sampling.cpp @@ -320,6 +320,7 @@ FilterDocSampling::FilterDocSampling() << FP_UNIFORM_MESH_RESAMPLING << FP_VORONOI_CLUSTERING << FP_VORONOI_COLORING + << FP_DISK_COLORING ; foreach(FilterIDType tt , types()) @@ -342,6 +343,7 @@ const QString FilterDocSampling::filterName(FilterIDType filterId) case FP_UNIFORM_MESH_RESAMPLING : return QString("Uniform Mesh Resampling"); case FP_VORONOI_CLUSTERING : return QString("Voronoi Vertex Clustering"); case FP_VORONOI_COLORING : return QString("Voronoi Vertex Coloring"); + case FP_DISK_COLORING : return QString("Disk Vertex Coloring"); default : assert(0); return QString("unknown filter!!!!"); } @@ -368,7 +370,8 @@ const QString FilterDocSampling::filterInfo(FilterIDType filterId) case FP_VORONOI_CLUSTERING : return QString("Apply a clustering algorithm that builds voronoi cells over the mesh starting from random points," "collapse each voronoi cell to a single vertex, and construct the triangulation according to the clusters adjacency relations.
" "Very similar to the technique described in 'Approximated Centroidal Voronoi Diagrams for Uniform Polygonal Mesh Coarsening' - Valette Chassery - Eurographics 2004"); - case FP_VORONOI_COLORING : return QString("Color a Mesh M and a Pointset P, The filter project each vertex of P over M and color M according to the geodesic distance from these projected points. Projection and coloring are done on a per vertex basis."); + case FP_VORONOI_COLORING : return QString("Given a Mesh M and a Pointset P, The filter project each vertex of P over M and color M according to the geodesic distance from these projected points. Projection and coloring are done on a per vertex basis."); + case FP_DISK_COLORING : return QString("Given a Mesh M and a Pointset P, The filter project each vertex of P over M and color M according to the geodesic distance from these projected points. Projection and coloring are done on a per vertex basis."); default : assert(0); return QString("unknown filter!!!!"); } @@ -387,7 +390,9 @@ const int FilterDocSampling::getRequirements(QAction *action) case FP_MONTECARLO_SAMPLING : case FP_POISSONDISK_SAMPLING : case FP_SIMILAR_SAMPLING : + case FP_DISK_COLORING : case FP_SUBDIV_SAMPLING : return 0; + case FP_TEXEL_SAMPLING : return MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTNORMAL; default: assert(0); @@ -526,6 +531,20 @@ void FilterDocSampling::initParameterSet(QAction *action, MeshDocument & md, Fil parlst.addMesh ("VertexMesh", target, "Vertex Mesh", "The mesh that is sampled for the comparison."); } break; + case FP_DISK_COLORING : + { + MeshModel *target= md.mm(); + foreach (target, md.meshList) + if (target != md.mm()) break; + + parlst.addMesh ("ColoredMesh", md.mm(), "To be Colored Mesh", + "The mesh whose surface is sampled. For each sample we search the closest point on the Target Mesh."); + parlst.addMesh ("VertexMesh", target, "Vertex Mesh", + "The mesh that is sampled for the comparison."); + float Diag = md.mm()->cm.bbox.Diag(); + parlst.addDynamicFloat("Radius", Diag/10.0f, 0.0f, Diag/3.0f, MeshModel::MM_VERTCOLOR, tr("Radius"), tr("A float between 0 and 1 that represents the percent variation from this color that will be selected. For example if the R was 200 and you put 0.1 then any color with R 200+-25.5 will be selected.") ); + + } break; default : assert(0); } } @@ -818,9 +837,22 @@ bool FilterDocSampling::applyFilter(QAction *action, MeshDocument &md, FilterPar vector vecV; // points to vertexes of ColoredMesh; VoronoiProcessing::SeedToVertexConversion (mmM->cm, vecP, vecV); Log("Converted %ui points into %ui vertex ",vecP.size(),vecV.size()); - for(int i=0;iC()=Color4b::Red; + for(uint i=0;iC()=Color4b::Red; VoronoiProcessing::VoronoiColoring(mmM->cm, vecV); } break; + case FP_DISK_COLORING : + { + MeshModel* mmM = par.getMesh("ColoredMesh"); // surface where we choose the random samples + MeshModel* mmV = par.getMesh("VertexMesh"); // surface that is sought for the closest point to each sample. + CMeshO::VertexIterator vim,viv; + CMeshO::ScalarType r2 = par.getDynamicFloat("Radius"); + r2=r2*r2; + tri::UpdateColor::VertexConstant(mmM->cm, Color4b::LightGray); + for(vim = mmM->cm.vert.begin(); vim!= mmM->cm.vert.end(); ++vim) if(!(*vim).IsD()) + for(viv = mmV->cm.vert.begin(); viv!= mmV->cm.vert.end(); ++viv) if(!(*viv).IsD()) + if(SquaredDistance((*viv).cP(), (*vim).cP()) < r2) + vim->C()=Color4b::Red; + } break; default : assert(0); } @@ -840,7 +872,8 @@ const MeshFilterInterface::FilterClass FilterDocSampling::getClass(QAction *acti case FP_TEXEL_SAMPLING : return FilterDocSampling::Sampling; case FP_VORONOI_CLUSTERING: return FilterDocSampling::Remeshing; case FP_UNIFORM_MESH_RESAMPLING: return FilterDocSampling::Remeshing; - case FP_VORONOI_COLORING: return FilterDocSampling::Sampling; + case FP_DISK_COLORING: + case FP_VORONOI_COLORING: return MeshFilterInterface::FilterClass(FilterDocSampling::Sampling | FilterDocSampling::VertexColoring); default: assert(0); } return FilterClass(0); diff --git a/src/meshlabplugins/filter_sampling/filter_sampling.h b/src/meshlabplugins/filter_sampling/filter_sampling.h index 136490d00..3588bccd4 100644 --- a/src/meshlabplugins/filter_sampling/filter_sampling.h +++ b/src/meshlabplugins/filter_sampling/filter_sampling.h @@ -56,6 +56,7 @@ public: FP_UNIFORM_MESH_RESAMPLING, FP_VORONOI_CLUSTERING, FP_VORONOI_COLORING, + FP_DISK_COLORING, FP_POISSONDISK_SAMPLING } ;