diff --git a/apps/sample/trimesh_sampling/trimesh_sampling.cpp b/apps/sample/trimesh_sampling/trimesh_sampling.cpp index 8df5c2fb..679762b2 100644 --- a/apps/sample/trimesh_sampling/trimesh_sampling.cpp +++ b/apps/sample/trimesh_sampling/trimesh_sampling.cpp @@ -23,8 +23,10 @@ #include #include +#include #include +#include using namespace vcg; using namespace std; @@ -37,7 +39,7 @@ struct MyUsedTypes : public UsedTypes< Use ::AsVertexType, Use ::AsFaceType>{}; class MyVertex : public Vertex{}; -class MyFace : public Face< MyUsedTypes, face::FFAdj, face::VertexRef, face::BitFlags > {}; +class MyFace : public Face< MyUsedTypes, face::FFAdj, face::Normal3f, face::VertexRef, face::BitFlags > {}; class MyEdge : public Edge{}; class MyMesh : public tri::TriMesh< vector, vector , vector > {}; @@ -45,7 +47,7 @@ int main( int argc, char **argv ) { if(argc<2) { - printf("Usage trimesh_base \n"); + printf("Usage trimesh_base radius\n"); return -1; } @@ -56,9 +58,66 @@ int main( int argc, char **argv ) printf("Error reading file %s\n",argv[1]); exit(0); } + tri::SurfaceSampling >::SamplingRandomGenerator().initialize(time(0)); + + //---------------------------------------------------------------------- + // Basic Sample, + // Build a point cloud with points with a plain poisson disk distribution + int t0=clock(); vector pointVec; - float radius; - tri::PoissonSampling(m,pointVec,1000,radius); + float rad; + if(argc>2) rad=atof(argv[2]); + int sampleNum=rad?0:1000; + tri::PoissonSampling(m,pointVec,sampleNum,rad); + int t1=clock(); + MyMesh BasicPoissonMesh; + tri::Build(BasicPoissonMesh,pointVec); + + tri::io::ExporterOFF::Save(BasicPoissonMesh,"BasicPoissonMesh.off"); + printf("Computed a basic poisson disk distribution of %i vertices radius is %6.3f in %5.2f sec\n",BasicPoissonMesh.VN(),rad,float(t1-t0)/CLOCKS_PER_SEC); + + //---------------------------------------------------------------------- + // Advanced Sample + // Make a feature dependent Poisson Disk sampling + MyMesh MontecarloSurfaceMesh; + MyMesh MontecarloEdgeMesh; + MyMesh PoissonEdgeMesh; + MyMesh PoissonMesh; + + std::vector sampleVec; + tri::TrivialSampler mps(sampleVec); + tri::UpdateTopology::FaceFace(m); + tri::UpdateNormal::PerFace(m); + tri::UpdateFlags::FaceFauxCrease(m,math::ToRad(40.0f)); + tri::SurfaceSampling >::EdgeMontecarlo(m,mps,10000,false); + tri::Build(MontecarloEdgeMesh,sampleVec); + tri::io::ExporterOFF::Save(MontecarloEdgeMesh,"MontecarloEdgeMesh.off"); + + sampleVec.clear(); + tri::SurfaceSampling >::VertexCrease(m, mps); + tri::Build(PoissonEdgeMesh,sampleVec); + tri::io::ExporterOFF::Save(PoissonEdgeMesh,"CreaseMesh.off"); + + tri::SurfaceSampling >::PoissonDiskParam pp; + pp.preGenMesh = &PoissonEdgeMesh; + pp.preGenFlag=true; + sampleVec.clear(); + tri::SurfaceSampling >::PoissonDiskPruning(mps, MontecarloEdgeMesh, rad, pp); + tri::Build(PoissonEdgeMesh,sampleVec); + tri::io::ExporterOFF::Save(PoissonEdgeMesh,"PoissonEdgeMesh.off"); + + sampleVec.clear(); + tri::SurfaceSampling >::Montecarlo(m,mps,50000); + tri::Build(MontecarloSurfaceMesh,sampleVec); + tri::io::ExporterOFF::Save(MontecarloSurfaceMesh,"MontecarloSurfaceMesh.off"); + + pp.preGenMesh = &PoissonEdgeMesh; + pp.preGenFlag=true; + sampleVec.clear(); + tri::SurfaceSampling >::PoissonDiskPruning(mps, MontecarloSurfaceMesh, rad, pp); + tri::Build(PoissonMesh,sampleVec); + tri::io::ExporterOFF::Save(PoissonMesh,"PoissonMesh.off"); + printf("Computed a feature aware poisson disk distribution of %i vertices radius is %6.3f\n",PoissonMesh.VN(),rad); return 0; }