diff --git a/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp b/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp index 3063dafc..ad381465 100644 --- a/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp +++ b/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp @@ -24,7 +24,9 @@ #include #include #include +#include #include +#include #include #include @@ -39,8 +41,8 @@ struct MyUsedTypes : public UsedTypes< Use ::AsVertexType, Use ::AsEdgeType, Use ::AsFaceType>{}; -class MyVertex : public Vertex{}; -class MyFace : public Face< MyUsedTypes, face::VertexRef, face::BitFlags, face::VFAdj > {}; +class MyVertex : public Vertex{}; +class MyFace : public Face< MyUsedTypes, face::VertexRef, face::Normal3f, face::BitFlags, face::VFAdj, face::FFAdj > {}; //class MyEdge : public Edge< MyUsedTypes> {}; class MyEdge : public Edge< MyUsedTypes, edge::VertexRef, edge::BitFlags>{}; class MyMesh : public tri::TriMesh< vector, vector, vector > {}; @@ -64,7 +66,7 @@ int main( int argc, char **argv ) MyMesh baseMesh, outMesh, polyMesh; if(argc < 4 ) { - printf("Usage trimesh_voronoisampling mesh sampleNum variance iterNum\n"); + printf("Usage trimesh_voronoisampling mesh sampleNum iterNum variance \n"); return -1; } int sampleNum = atoi(argv[2]); @@ -80,31 +82,67 @@ int main( int argc, char **argv ) } tri::UpdateTopology::VertexFace(baseMesh); + tri::UpdateFlags::FaceBorderFromVF(baseMesh); + + // -- Build the mesh with corners + MyMesh cornerMesh; + std::vector sampleVec; + tri::TrivialSampler mps(sampleVec); + tri::SurfaceSampling >::VertexBorderCorner(baseMesh,mps,math::ToRad(150.f)); + tri::Build(cornerMesh,sampleVec); + + // -- Build the montercarlo sampling of the surface + MyMesh MontecarloSurfaceMesh; + sampleVec.clear(); + tri::SurfaceSampling >::Montecarlo(baseMesh,mps,50000); + tri::Build(MontecarloSurfaceMesh,sampleVec); + tri::io::ExporterPLY::Save(MontecarloSurfaceMesh,"MontecarloSurfaceMesh.ply"); + + // -- Prune the montecarlo sampling with poisson strategy using the precomputed corner vertexes. + tri::SurfaceSampling >::PoissonDiskParam pp; + pp.preGenMesh = &cornerMesh; + pp.preGenFlag=true; + sampleVec.clear(); + float radius = tri::SurfaceSampling >::ComputePoissonDiskRadius(baseMesh,sampleNum); + tri::SurfaceSampling >::PoissonDiskPruning(mps, MontecarloSurfaceMesh, radius, pp); + MyMesh PoissonMesh; + tri::Build(PoissonMesh,sampleVec); + tri::io::ExporterPLY::Save(PoissonMesh,"PoissonMesh.ply"); + std::vector seedVec; - vector pointVec; - float radius=0; + tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,sampleVec,seedVec); + float eps = baseMesh.bbox.Diag()/10000.0f; + for(int i=0;iP()) < eps) + seedVec[j]->SetS(); + } + tri::VoronoiProcessingParameter vpp; vpp.deleteUnreachedRegionFlag=true; - - - tri::PoissonSampling(baseMesh,pointVec,sampleNum,radius); - tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,pointVec,seedVec); + vpp.fixSelectedSeed=true; tri::EuclideanDistance dd; + int t0=clock(); tri::VoronoiProcessing >::VoronoiRelaxing(baseMesh, seedVec, iterNum, dd, vpp); - tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,outMesh,polyMesh,seedVec, dd, vpp); - tri::io::ExporterPLY::Save(outMesh,"out.ply",tri::io::Mask::IOM_VERTCOLOR ); + int t1=clock(); + tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,outMesh,polyMesh, seedVec, dd, vpp); + tri::io::ExporterPLY::Save(baseMesh,"base.ply",tri::io::Mask::IOM_VERTCOLOR ); + tri::io::ExporterPLY::Save(outMesh,"out.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_FLAGS ); tri::io::ExporterPLY::Save(polyMesh,"poly.ply",tri::io::Mask::IOM_VERTCOLOR| tri::io::Mask::IOM_EDGEINDEX ,false); - tri::io::ImporterPLY::Open(baseMesh,argv[1]); - tri::UpdateTopology::VertexFace(baseMesh); - tri::PoissonSampling(baseMesh,pointVec,sampleNum,radius,radiusVariance); - tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,pointVec,seedVec); - tri::IsotropicDistance id(baseMesh,radiusVariance); - tri::VoronoiProcessing >::VoronoiRelaxing(baseMesh, seedVec, iterNum,id,vpp); - tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,outMesh,polyMesh,seedVec, id, vpp); +// tri::io::ImporterPLY::Open(baseMesh,argv[1]); +// tri::UpdateTopology::VertexFace(baseMesh); +// tri::PoissonSampling(baseMesh,pointVec,sampleNum,radius,radiusVariance); +// tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,pointVec,seedVec); +// tri::IsotropicDistance id(baseMesh,radiusVariance); +// tri::VoronoiProcessing >::VoronoiRelaxing(baseMesh, seedVec, iterNum,id,vpp); +// tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,outMesh,polyMesh,seedVec, id, vpp); - tri::io::ExporterPLY::Save(outMesh,"outW.ply",tri::io::Mask::IOM_VERTCOLOR ); - tri::io::ExporterPLY::Save(polyMesh,"polyW.ply",tri::io::Mask::IOM_VERTCOLOR | tri::io::Mask::IOM_EDGEINDEX,false); +// tri::io::ExporterPLY::Save(outMesh,"outW.ply",tri::io::Mask::IOM_VERTCOLOR ); +// tri::io::ExporterPLY::Save(polyMesh,"polyW.ply",tri::io::Mask::IOM_VERTCOLOR | tri::io::Mask::IOM_EDGEINDEX,false); +// tri::io::ExporterDXF::Save(polyMesh,"outW.dxf"); + printf("Completed! %i iterations in %f sec for %i seeds \n",iterNum,float(t1-t0)/CLOCKS_PER_SEC,seedVec.size()); return 0; }