From 20b46e31224bbdcb92765b90240342f2f83f118a Mon Sep 17 00:00:00 2001 From: cignoni Date: Thu, 18 Dec 2008 00:30:52 +0000 Subject: [PATCH] added the default use of a safe random generator for shuffling vectors (mingw rand seems really bad...) --- vcg/complex/trimesh/point_sampling.h | 37 +++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/vcg/complex/trimesh/point_sampling.h b/vcg/complex/trimesh/point_sampling.h index 8e4c227f..d104567b 100644 --- a/vcg/complex/trimesh/point_sampling.h +++ b/vcg/complex/trimesh/point_sampling.h @@ -34,6 +34,8 @@ Each function calls many time the sample object with the sampling point as param ****************************************************************************/ #ifndef __VCGLIB_POINT_SAMPLING #define __VCGLIB_POINT_SAMPLING + +#include #include #include #include @@ -86,9 +88,16 @@ class SurfaceSampling typedef typename MetroMesh::FaceType FaceType; typedef typename MetroMesh::FaceContainer FaceContainer; public: + +static math::SubtractiveRingRNG &SamplingRandomGenerator() +{ + static math::SubtractiveRingRNG rnd; + return rnd; +} -static -void AllVertex(MetroMesh & m, VertexSampler &ps) +static unsigned int RandomInt(unsigned int i) { return SamplingRandomGenerator().generate(i); } + +static void AllVertex(MetroMesh & m, VertexSampler &ps) { VertexIterator vi; for(vi=m.vert.begin();vi!=m.vert.end();++vi) @@ -172,7 +181,8 @@ static void FillAndShuffleFacePointerVector(MetroMesh & m, std::vector &vertVec) { @@ -182,13 +192,14 @@ static void FillAndShuffleVertexPointerVector(MetroMesh & m, std::vector=m.vn) - { + if(sampleNum>=m.vn) { AllVertex(m,ps); return; } @@ -201,6 +212,20 @@ static void VertexUniform(MetroMesh & m, VertexSampler &ps, int sampleNum) } +static void FaceUniform(MetroMesh & m, VertexSampler &ps, int sampleNum) +{ + if(sampleNum>=m.fn) { + AllFace(m,ps); + return; + } + + std::vector faceVec; + FillAndShuffleFacePointerVector(m,faceVec); + + for(int i =0; i< sampleNum; ++i) + ps.AddFace(*faceVec[i],Barycenter(*faceVec[i])); +} + static void AllFace(MetroMesh & m, VertexSampler &ps) { FaceIterator fi;