24 #include <vcg/complex/complex.h>
25 #include <vcg/complex/algorithms/update/component_ep.h>
26 #include <vcg/complex/algorithms/update/quality.h>
27 #include <vcg/complex/algorithms/update/color.h>
28 #include <vcg/complex/algorithms/stat.h>
29 #include <vcg/complex/algorithms/clean.h>
30 #include <vcg/complex/algorithms/intersection.h>
31 #include <vcg/space/index/grid_static_ptr.h>
32 #include <vcg/space/index/spatial_hashing.h>
33 #include <vcg/complex/algorithms/closest.h>
36 #include <wrap/io_trimesh/import.h>
37 #include <wrap/io_trimesh/export_ply.h>
46 struct MyUsedTypes :
public UsedTypes< Use<MyVertex> ::AsVertexType,
47 Use<MyEdge> ::AsEdgeType,
48 Use<MyFace> ::AsFaceType>{};
51 class MyVertex :
public Vertex< MyUsedTypes, vertex::Coord3f, vertex::BitFlags, vertex::Normal3f, vertex::Mark,vertex::Color4b, vertex::Qualityf>{};
52 class MyEdge :
public Edge<MyUsedTypes>{};
53 class MyFace :
public Face <MyUsedTypes, face::VertexRef,face::BitFlags,face::Mark, face::Normal3f> {};
55 class MyMesh :
public tri::TriMesh< vector<MyVertex>, vector<MyFace > >{};
58 typedef vcg::GridStaticPtr<MyMesh::FaceType, MyMesh::ScalarType> TriMeshGrid;
61 int main(
int argc,
char ** argv)
66 printf(
" Compute an approximation of the shape diameter function\n");
67 printf(
" Usage: trimesh_intersection <filename> [angle samplenum]\n\n");
68 printf(
" <filename> Mesh model for which to compute the sdf (PLY format).\n");
69 printf(
" angle the wideness (degree) of the cone of ray that must be shot from each vertex (default 45)\n");
70 printf(
" samplenum the oversampling factor (0 -> one ray, 1, 9 ray, 2-> 25 rays (default 2)\n");
78 int err = tri::io::Importer<MyMesh>::Open(m,argv[1]);
80 printf(
"Error in reading %s: '%s'\n",argv[1],tri::io::Importer<MyMesh>::ErrorMsg(err));
84 float widenessRad = math::ToRad(20.0);
87 widenessRad = math::ToRad(atof(argv[2]));
88 printf(
"Setting wideness to %f degree\n",atof(argv[2]));
91 if(argc>3) n_samples = atoi(argv[3]);
92 int samplePerVert = (n_samples*2+ 1)*(n_samples*2+ 1);
93 printf(
"Using oversampling to %i (%i sample per vertex)\n",n_samples,samplePerVert);
100 if (dup > 0 || unref > 0)
101 printf(
"Removed %i duplicate and %i unreferenced vertices from mesh %s\n",dup,unref,argv[1]);
109 TriMeshGrid static_grid;
110 static_grid.Set(m.face.begin(), m.face.end());
112 typedef MyMesh::ScalarType ScalarType;
115 MyMesh::FaceType *rf;
116 MyMesh::VertexIterator vi;
117 float maxDist=m.bbox.Diag();
118 float offset= maxDist / 10000.0;
121 ScalarType deltaRad=widenessRad/(ScalarType)(n_samples*2);
122 if(n_samples==0) deltaRad=0;
125 for(vi=m.vert.begin();vi!=m.vert.end();++vi)
128 ray.SetOrigin((*vi).cP()-((*vi).cN()*offset));
129 Point3f dir0 = -(*vi).cN();
131 ScalarType theta_init,phi_init,ro;
132 dir0.ToPolarRad(ro,theta_init,phi_init);
133 for (
int x=-n_samples;x<=n_samples;x++)
134 for (
int y=-n_samples;y<=n_samples;y++)
136 ScalarType theta=theta_init+x*deltaRad;
137 ScalarType phi=phi_init+y*deltaRad;
139 if (theta<0) theta=2.0*M_PI+theta;
142 dir.FromPolarRad(ro,theta,phi);
144 ray.SetDirection(dir);
146 rf = tri::DoRay<MyMesh,TriMeshGrid>(m,static_grid,ray,maxDist,t);
160 tri::io::ExporterPLY<MyMesh>::Save(m,
"SDF.ply",tri::io::Mask::IOM_VERTCOLOR+tri::io::Mask::IOM_VERTQUALITY);
162 printf(
"Initializated in %i msec\n",t1-t0);
163 printf(
"Completed in %i msec\n",t2-t1);
164 printf(
"Shoot %i rays and found %i intersections\n",m.VN()*samplePerVert,totRay);