86int main(
int argc,
char** argv )
88 trace.
info() <<
"Usage: " << argv[ 0 ] <<
" <input.obj> <h> <view>" << std::endl;
89 trace.
info() <<
"\tComputes a digital polyhedron from an OBJ file" << std::endl;
90 trace.
info() <<
"\t- input.obj: choose your favorite mesh" << std::endl;
91 trace.
info() <<
"\t- h [==1]: the digitization gridstep" << std::endl;
92 trace.
info() <<
"\t- view [==7]: display vertices(1), edges(2), faces(4)" << std::endl;
93 string filename = examplesPath +
"samples/lion.obj";
94 std::string fn = argc > 1 ? argv[ 1 ] : filename;
95 double h = argc > 2 ? atof( argv[ 2 ] ) : 1.0;
96 int view = argc > 3 ? atoi( argv[ 3 ] ) : 7;
98 std::ifstream input( fn.c_str() );
103 trace.
error() <<
"Unable to read obj file : " << fn << std::endl;
110 Point lo(-500,-500,-500);
111 Point up(500,500,500);
115 auto vertices = std::vector<Point>(
surfmesh.nbVertices() );
124 std::set< Point > faces_set, edges_set;
125 auto faceVertices =
surfmesh.allIncidentVertices();
126 auto edgeVertices =
surfmesh.allEdgeVertices();
129 for (
size_t f = 0; f <
surfmesh.nbFaces(); ++f )
132 for (
auto v : faceVertices[ f ] )
133 X.push_back( vertices[ v ] );
134 auto F = dconv.
envelope( X, Algorithm::DIRECT );
135 faces_set.insert( F.cbegin(), F.cend() );
137 for (
size_t e = 0; e <
surfmesh.nbEdges(); ++e )
140 { vertices[ edgeVertices[ e ].first ],
141 vertices[ edgeVertices[ e ].second ] };
142 auto E = dconv.
envelope( X, Algorithm::DIRECT );
143 edges_set.insert( E.cbegin(), E.cend() );
146 std::vector< Point > face_points, edge_points;
147 std::vector< Point > vertex_points = vertices;
148 std::sort( vertex_points.begin(), vertex_points.end() );
149 std::set_difference( faces_set.cbegin(), faces_set.cend(),
150 edges_set.cbegin(), edges_set.cend(),
151 std::back_inserter( face_points ) );
152 std::set_difference( edges_set.cbegin(), edges_set.cend(),
153 vertex_points.cbegin(), vertex_points.cend(),
154 std::back_inserter( edge_points ) );
155 auto total = vertex_points.size() + edge_points.size() + face_points.size();
156 trace.
info() <<
"#vertex points=" << vertex_points.size() << std::endl;
157 trace.
info() <<
"#edge points=" << edge_points.size() << std::endl;
158 trace.
info() <<
"#face points=" << face_points.size() << std::endl;
159 trace.
info() <<
"#total points=" << total << std::endl;
165 viewer.drawColor( colors[ 0 ] );
166 viewer.drawColor( colors[ 0 ] );
167 for (
auto p : vertices ) viewer << p;
171 viewer.drawColor( colors[ 1 ] );
172 viewer.drawColor( colors[ 1 ] );
173 for (
auto p : edge_points ) viewer << p;
177 viewer.drawColor( colors[ 2 ] );
178 viewer.drawColor( colors[ 2 ] );
179 for (
auto p : face_points ) viewer << p;