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>
32 #include<vcg/complex/algorithms/voronoi_volume_sampling.h>
41 struct MyUsedTypes :
public UsedTypes< Use<MyVertex> ::AsVertexType,
42 Use<MyEdge> ::AsEdgeType,
43 Use<MyFace> ::AsFaceType>{};
45 class MyVertex :
public Vertex<MyUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::VFAdj, vertex::Qualityf, vertex::Color4b, vertex::BitFlags >{};
46 class MyFace :
public Face< MyUsedTypes, face::VertexRef, face::Normal3f, face::BitFlags, face::Mark, face::VFAdj, face::FFAdj > {};
47 class MyEdge :
public Edge< MyUsedTypes, edge::VertexRef, edge::BitFlags>{};
48 class MyMesh :
public tri::TriMesh< vector<MyVertex>, vector<MyEdge>, vector<MyFace> > {};
53 struct EmUsedTypes :
public UsedTypes< Use<EmVertex> ::AsVertexType,
54 Use<EmEdge> ::AsEdgeType,
55 Use<EmFace> ::AsFaceType>{};
57 class EmVertex :
public Vertex<EmUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::VFAdj , vertex::Qualityf, vertex::Color4b, vertex::BitFlags >{};
58 class EmFace :
public Face< EmUsedTypes, face::VertexRef, face::BitFlags, face::VFAdj > {};
59 class EmEdge :
public Edge< EmUsedTypes, edge::VertexRef> {};
60 class EmMesh :
public tri::TriMesh< vector<EmVertex>, vector<EmEdge>, vector<EmFace> > {};
63 int main(
int argc,
char **argv )
69 printf(
"Usage trimesh_voronoisampling origSurf offsetSurf radius \n"
70 "radius is expressed as a perc bbox diag (e.g. 0.1 -> 10 % of bbox diag) \n");
74 tri::io::ImporterPLY<MyMesh>::Open(mSur,argv[1]);
75 tri::io::ImporterPLY<MyMesh>::Open(mOff,argv[2]);
79 std::vector<Point3f> sampleSurVec, sampleOffVec;
81 MontecarloSampling(mOff, sampleOffVec,50000);
82 sampleSurVec.insert( sampleSurVec.end(), sampleOffVec.begin(), sampleOffVec.end() );
85 printf(
"Read %i vn %i fn \n",mOff.vn, mOff.fn);
87 float poissonRadius = mOff.bbox.Diag()*atof(argv[3]);
89 printf(
"Poisson Radius %f\n",poissonRadius);
91 float sampleSurfRadius=mOff.bbox.Diag()/100.0f;
92 int montecarloSampleNum = 100000;
95 VoronoiVolumeSampling<MyMesh> vvs(mOff, seedM);
96 printf(
"Sampling Surface at a radius %f ",sampleSurfRadius);
97 vvs.Init(sampleSurfRadius);
98 tri::BuildMeshFromCoordVector(vvs.seedDomainMesh, sampleSurVec);
100 vvs.BuildVolumeSampling(montecarloSampleNum,0,poissonRadius);
103 tri::io::ExporterPLY<MyMesh>::Save(vvs.seedDomainMesh,
"seedDomainMesh.ply");
104 tri::io::ExporterPLY<MyMesh>::Save(vvs.poissonSurfaceMesh,
"poissonSurfaceMesh.ply");
105 tri::io::ExporterPLY<MyMesh>::Save(vvs.montecarloVolumeMesh,
"montecarloVolumeMesh.ply");
106 tri::io::ExporterPLY<MyMesh>::Save(seedM,
"seedMesh0.ply");
109 vvs.QuadricRelaxVoronoiSamples(10);
112 tri::io::ExporterPLY<MyMesh>::Save(seedM,
"seedMesh1.ply",tri::io::Mask::IOM_VERTCOLOR | tri::io::Mask::IOM_VERTQUALITY );
113 vvs.QuadricRelaxVoronoiSamples(10);
116 tri::io::ExporterPLY<MyMesh>::Save(seedM,
"seedMesh2.ply",tri::io::Mask::IOM_VERTCOLOR | tri::io::Mask::IOM_VERTQUALITY );
117 printf(
"\n Saved %i points \n",seedM.vn);