From 4109eecfecb6366153da7915be32c627e15e2c04 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Thu, 26 Mar 2009 11:02:30 +0000 Subject: [PATCH] Corrected the code of the poisson sampling for getting subsamples of a given point cloud --- .../filter_sampling/filter_sampling.cpp | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/meshlabplugins/filter_sampling/filter_sampling.cpp b/src/meshlabplugins/filter_sampling/filter_sampling.cpp index 758d9691a..059bd9e49 100644 --- a/src/meshlabplugins/filter_sampling/filter_sampling.cpp +++ b/src/meshlabplugins/filter_sampling/filter_sampling.cpp @@ -680,14 +680,20 @@ bool FilterDocSampling::applyFilter(QAction *action, MeshDocument &md, FilterPar Log("Computing %i Poisson Samples for an expected radius of %f",sampleNum,radius); // first of all generate montecarlo samples for fast lookup - CMeshO presampledMesh; - BaseSampler sampler(&presampledMesh); - sampler.qualitySampling =true; - if(subsampleFlag) tri::SurfaceSampling::AllVertex(curMM->cm, sampler); - else tri::SurfaceSampling::Montecarlo(curMM->cm, sampler, sampleNum*par.getInt("MontecarloRate")); - Log("Generated %i Montecarlo Samples",presampledMesh.vn); - presampledMesh.bbox = curMM->cm.bbox; // we want the same bounding box - + CMeshO *presampledMesh=&(curMM->cm); + + CMeshO MontecarloMesh; // this mesh is used only if we need real pooisson sampling (and therefore we need to choose points different from the starting mesh vertices) + + if(!subsampleFlag) + { + BaseSampler sampler(&MontecarloMesh); + sampler.qualitySampling =true; + tri::SurfaceSampling::Montecarlo(curMM->cm, sampler, sampleNum*par.getInt("MontecarloRate")); + Log("Generated %i Montecarlo Samples",MontecarloMesh.vn); + MontecarloMesh.bbox = curMM->cm.bbox; // we want the same bounding box + CMeshO *presampledMesh=&MontecarloMesh; + } + BaseSampler mps(&(mm->cm)); tri::SurfaceSampling::PoissonDiskParam pp; @@ -698,7 +704,7 @@ bool FilterDocSampling::applyFilter(QAction *action, MeshDocument &md, FilterPar Log("Variable Density variance is %f, radius can vary from %f to %f",pp.radiusVariance,radius/pp.radiusVariance,radius*pp.radiusVariance); } - tri::SurfaceSampling::Poissondisk(curMM->cm, mps, presampledMesh, radius,pp); + tri::SurfaceSampling::Poissondisk(curMM->cm, mps, *presampledMesh, radius,pp); vcg::tri::UpdateBounding::Box(mm->cm); Log(GLLogStream::FILTER,"Sampling created a new mesh of %i points",md.mm()->cm.vn);