diff --git a/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp b/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp index 02852cb8..e4338ee9 100644 --- a/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp +++ b/apps/sample/trimesh_voronoisampling/trimesh_voronoisampling.cpp @@ -63,17 +63,18 @@ class EmMesh : public tri::TriMesh< vector, vector, vector< int main( int argc, char **argv ) { - MyMesh baseMesh, outMesh, polyMesh; + MyMesh baseMesh; if(argc < 4 ) { - printf("Usage trimesh_voronoisampling mesh sampleNum iterNum edgeCollapsePerc \n"); + printf("Usage trimesh_voronoisampling mesh sampleNum iterNum\n"); return -1; } int sampleNum = atoi(argv[2]); int iterNum = atoi(argv[3]); - float collapseShortEdgePerc = atof(argv[4]); - printf("Reading %s and sampling %i points with %i iteration and using %f variance\n",argv[1],sampleNum,iterNum,collapseShortEdgePerc); + bool fixCornerFlag=true; + + printf("Reading %s and sampling %i points with %i iteration",argv[1],sampleNum,iterNum); int ret= tri::io::ImporterPLY::Open(baseMesh,argv[1]); if(ret!=0) { @@ -81,6 +82,8 @@ int main( int argc, char **argv ) return -1; } + tri::VoronoiProcessingParameter vpp; + tri::Clean::RemoveUnreferencedVertex(baseMesh); tri::Allocator::CompactEveryVector(baseMesh); tri::UpdateTopology::VertexFace(baseMesh); @@ -95,18 +98,21 @@ int main( int argc, char **argv ) MyMesh poissonCornerMesh; std::vector sampleVec; tri::TrivialSampler mps(sampleVec); - tri::SurfaceSampling >::VertexBorderCorner(baseMesh,mps,math::ToRad(150.f)); - tri::Build(poissonCornerMesh,sampleVec); - tri::io::ExporterPLY::Save(poissonCornerMesh,"cornerMesh.ply"); - sampleVec.clear(); - tri::SurfaceSampling >::PoissonDiskPruning(mps, poissonCornerMesh, radius, pp); - tri::Build(poissonCornerMesh,sampleVec); - tri::io::ExporterPLY::Save(poissonCornerMesh,"poissonCornerMesh.ply"); - - // Now save the corner as Fixed Seeds for later... - std::vector fixedSeedVec; - tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,sampleVec,fixedSeedVec); - tri::VoronoiProcessing >::FixVertexVector(baseMesh,fixedSeedVec); + if(fixCornerFlag) + { + tri::SurfaceSampling >::VertexBorderCorner(baseMesh,mps,math::ToRad(150.f)); + tri::Build(poissonCornerMesh,sampleVec); + tri::io::ExporterPLY::Save(poissonCornerMesh,"cornerMesh.ply"); + sampleVec.clear(); + tri::SurfaceSampling >::PoissonDiskPruning(mps, poissonCornerMesh, radius, pp); + tri::Build(poissonCornerMesh,sampleVec); + tri::io::ExporterPLY::Save(poissonCornerMesh,"poissonCornerMesh.ply"); + // Now save the corner as Fixed Seeds for later... + std::vector fixedSeedVec; + tri::VoronoiProcessing::SeedToVertexConversion(baseMesh,sampleVec,fixedSeedVec); + tri::VoronoiProcessing >::FixVertexVector(baseMesh,fixedSeedVec); + vpp.preserveFixedSeed=true; + } // -- Build a sampling with points on the border MyMesh borderMesh,poissonBorderMesh; @@ -119,7 +125,7 @@ int main( int argc, char **argv ) pp.preGenMesh = &poissonCornerMesh; pp.preGenFlag=true; sampleVec.clear(); - tri::SurfaceSampling >::PoissonDiskPruning(mps, borderMesh, radius, pp); + tri::SurfaceSampling >::PoissonDiskPruning(mps, borderMesh, radius*0.8f, pp); tri::Build(poissonBorderMesh,sampleVec); tri::io::ExporterPLY::Save(poissonBorderMesh,"PoissonEdgeMesh.ply"); @@ -149,13 +155,9 @@ int main( int argc, char **argv ) baseMesh.vert[i].SetS(); } - tri::VoronoiProcessingParameter vpp; vpp.deleteUnreachedRegionFlag=true; - vpp.preserveFixedSeed=true; - vpp.collapseShortEdge=true; - vpp.collapseShortEdgePerc=collapseShortEdgePerc; vpp.triangulateRegion = true; - vpp.unbiasedSeedFlag =true; + vpp.triangulateRegion = false; vpp.geodesicRelaxFlag=false; vpp.constrainSelectedSeed=true; @@ -165,11 +167,16 @@ int main( int argc, char **argv ) tri::VoronoiProcessing >::VoronoiRelaxing(baseMesh, seedVec, iterNum, dd, vpp); int t1=clock(); + MyMesh voroMesh, voroPoly, delaMesh; // Get the result in some pleasant form converting it to a real voronoi diagram. - tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,outMesh,polyMesh, seedVec, dd, vpp); + tri::VoronoiProcessing >::ConvertVoronoiDiagramToMesh(baseMesh,voroMesh,voroPoly, seedVec, dd, vpp); tri::io::ExporterPLY::Save(baseMesh,"base.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY ); - 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::ExporterPLY::Save(voroMesh,"voroMesh.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_FLAGS ); + tri::io::ExporterPLY::Save(voroPoly,"voroPoly.ply",tri::io::Mask::IOM_VERTCOLOR| tri::io::Mask::IOM_EDGEINDEX ,false); + + tri::VoronoiProcessing >::ConvertDelaunayTriangulationToMesh(baseMesh,delaMesh, seedVec, dd, vpp); + tri::io::ExporterPLY::Save(delaMesh,"delaMesh.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY ); + // tri::io::ImporterPLY::Open(baseMesh,argv[1]); // tri::UpdateTopology::VertexFace(baseMesh);