24 #include<vcg/complex/complex.h>
25 #include<vcg/complex/algorithms/create/platonic.h>
26 #include<wrap/io_trimesh/import_ply.h>
27 #include<wrap/io_trimesh/export_off.h>
28 #include<wrap/io_trimesh/export_ply.h>
29 #include<wrap/io_trimesh/export_dxf.h>
30 #include<vcg/complex/algorithms/point_sampling.h>
31 #include<vcg/complex/algorithms/voronoi_processing.h>
40 struct MyUsedTypes :
public UsedTypes< Use<MyVertex> ::AsVertexType,
41 Use<MyEdge> ::AsEdgeType,
42 Use<MyFace> ::AsFaceType>{};
44 class MyVertex :
public Vertex<MyUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::VFAdj, vertex::Qualityf, vertex::Color4b, vertex::BitFlags >{};
45 class MyFace :
public Face< MyUsedTypes, face::VertexRef, face::Normal3f, face::BitFlags, face::Mark, face::VFAdj, face::FFAdj > {};
46 class MyEdge :
public Edge< MyUsedTypes, edge::VertexRef, edge::BitFlags>{};
47 class MyMesh :
public tri::TriMesh< vector<MyVertex>, vector<MyEdge>, vector<MyFace> > {};
52 struct EmUsedTypes :
public UsedTypes< Use<EmVertex> ::AsVertexType,
53 Use<EmEdge> ::AsEdgeType,
54 Use<EmFace> ::AsFaceType>{};
56 class EmVertex :
public Vertex<EmUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::VFAdj , vertex::Qualityf, vertex::Color4b, vertex::BitFlags >{};
57 class EmFace :
public Face< EmUsedTypes, face::VertexRef, face::BitFlags, face::VFAdj > {};
58 class EmEdge :
public Edge< EmUsedTypes, edge::VertexRef> {};
59 class EmMesh :
public tri::TriMesh< vector<EmVertex>, vector<EmEdge>, vector<EmFace> > {};
62 int main(
int argc,
char **argv )
67 printf(
"Usage trimesh_voronoisampling mesh sampleNum iterNum\n");
70 int sampleNum = atoi(argv[2]);
71 int iterNum = atoi(argv[3]);
73 bool fixCornerFlag=
true;
74 bool uniformEdgeSamplingFlag =
true;
76 printf(
"Reading %s and sampling %i points with %i iteration\n",argv[1],sampleNum,iterNum);
77 int ret= tri::io::ImporterPLY<MyMesh>::Open(baseMesh,argv[1]);
80 printf(
"Unable to open %s for '%s'\n",argv[1],tri::io::ImporterPLY<MyMesh>::ErrorMsg(ret));
84 tri::VoronoiProcessingParameter vpp;
92 tri::VoronoiProcessing<MyMesh>::PreprocessForVoronoi(baseMesh,radius,vpp);
99 MyMesh poissonCornerMesh;
100 std::vector<Point3f> sampleVec;
103 tri::BuildMeshFromCoordVector(poissonCornerMesh,sampleVec);
104 tri::io::ExporterPLY<MyMesh>::Save(poissonCornerMesh,
"cornerMesh.ply");
106 MyMesh borderMesh,poissonBorderMesh;
109 if(uniformEdgeSamplingFlag)
118 tri::BuildMeshFromCoordVector(poissonCornerMesh,sampleVec);
119 tri::io::ExporterPLY<MyMesh>::Save(poissonCornerMesh,
"poissonCornerMesh.ply");
121 std::vector<MyVertex *> fixedSeedVec;
122 tri::VoronoiProcessing<MyMesh>::SeedToVertexConversion(baseMesh,sampleVec,fixedSeedVec);
123 tri::VoronoiProcessing<MyMesh, tri::EuclideanDistance<MyMesh> >::MarkVertexVectorAsFixed(baseMesh,fixedSeedVec);
124 vpp.preserveFixedSeed=
true;
130 tri::BuildMeshFromCoordVector(borderMesh,sampleVec);
131 tri::io::ExporterPLY<MyMesh>::Save(borderMesh,
"borderMesh.ply");
134 pp.preGenMesh = &poissonCornerMesh;
138 tri::BuildMeshFromCoordVector(poissonBorderMesh,sampleVec);
141 tri::io::ExporterPLY<MyMesh>::Save(poissonBorderMesh,
"PoissonEdgeMesh.ply");
144 MyMesh MontecarloSurfaceMesh;
147 tri::BuildMeshFromCoordVector(MontecarloSurfaceMesh,sampleVec);
148 tri::io::ExporterPLY<MyMesh>::Save(MontecarloSurfaceMesh,
"MontecarloSurfaceMesh.ply");
151 pp.preGenMesh = &poissonBorderMesh;
155 tri::BuildMeshFromCoordVector(PoissonMesh,sampleVec);
156 tri::io::ExporterPLY<MyMesh>::Save(PoissonMesh,
"PoissonMesh.ply");
158 std::vector<MyVertex *> seedVec;
159 tri::VoronoiProcessing<MyMesh>::SeedToVertexConversion(baseMesh,sampleVec,seedVec);
164 for(
size_t i=0;i<baseMesh.vert.size();++i){
165 if(baseMesh.vert[i].IsB())
166 baseMesh.vert[i].SetS();
170 vpp.deleteUnreachedRegionFlag=
false;
171 vpp.triangulateRegion =
false;
172 vpp.geodesicRelaxFlag=
false;
173 vpp.constrainSelectedSeed=
true;
175 tri::EuclideanDistance<MyMesh> dd;
178 int actualIter = tri::VoronoiProcessing<MyMesh, tri::EuclideanDistance<MyMesh> >::VoronoiRelaxing(baseMesh, seedVec, iterNum, dd, vpp);
181 MyMesh voroMesh, voroPoly, delaMesh;
183 if(tri::VoronoiProcessing<MyMesh>::CheckVoronoiTopology(baseMesh,seedVec))
184 tri::VoronoiProcessing<MyMesh>::ConvertVoronoiDiagramToMesh(baseMesh,voroMesh,voroPoly,seedVec, vpp);
186 printf(
"WARNING some voronoi region are not disk like; the resulting delaunay triangulation is not manifold.\n");
188 tri::io::ExporterPLY<MyMesh>::Save(baseMesh,
"base.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
189 tri::io::ExporterPLY<MyMesh>::Save(voroMesh,
"voroMesh.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_FLAGS );
190 tri::io::ExporterPLY<MyMesh>::Save(voroPoly,
"voroPoly.ply",tri::io::Mask::IOM_VERTCOLOR| tri::io::Mask::IOM_EDGEINDEX ,
false);
192 tri::VoronoiProcessing<MyMesh>::ConvertDelaunayTriangulationToMesh(baseMesh,delaMesh, seedVec);
193 tri::io::ExporterPLY<MyMesh>::Save(delaMesh,
"delaMesh.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
194 tri::VoronoiProcessing<MyMesh>::RelaxRefineTriangulationSpring(baseMesh,delaMesh,2,10);
195 tri::io::ExporterPLY<MyMesh>::Save(delaMesh,
"delaMeshRef.ply",tri::io::Mask::IOM_VERTCOLOR + tri::io::Mask::IOM_VERTQUALITY );
209 printf(
"Completed! %i (%i) iterations in %f sec for %lu seeds \n",actualIter, iterNum,
float(t1-t0)/CLOCKS_PER_SEC,seedVec.size());