Computation of the convex hull of a set of lattice points in 3D by Quick Hull algorithm.
#include "DGtal/base/Common.h"
#include "DGtal/geometry/tools/QuickHull.h"
#include "DGtal/shapes/SurfaceMesh.h"
#include "DGtal/io/writers/SurfaceMeshWriter.h"
int main(
int argc,
char* argv[] )
{
int nb = argc > 1 ? atoi( argv[ 1 ] ) : 100;
double dR = argc > 2 ? atof( argv[ 2 ] ) : 10.0;
std::vector< Point > V;
const double R2 = dR * dR;
const int R = (int) ceil( dR );
for ( int i = 0; i < nb; ) {
Point p( rand() % (2*R+1) - R, rand() % (2*R+1) - R, rand() % (2*R+1) - R );
if ( p.squaredNorm() < R2 ) { V.push_back( p ); i++; }
}
std::cout <<
"#points=" << hull.
nbPoints()
<<
" #facets=" << hull.
nbFacets() << std::endl;
double total_time = 0;
[&total_time] ( double t ) { total_time += t; } );
std::cout <<
"purge duplicates= " << round(hull.
timings[ 0 ]) <<
" ms." << std::endl;
std::cout <<
"init simplex = " << round(hull.
timings[ 1 ]) <<
" ms." << std::endl;
std::cout <<
"quickhull core = " << round(hull.
timings[ 2 ]) <<
" ms." << std::endl;
std::cout <<
"compute vertices= " << round(hull.
timings[ 3 ]) <<
" ms." << std::endl;
std::cout << "total time = " << round(total_time) << " ms." << std::endl;
std::vector< RealPoint > positions;
std::vector< std::vector< std::size_t > > facets;
SMesh mesh( positions.cbegin(), positions.cend(), facets.cbegin(), facets.cend() );
std::ofstream out( "qhull.obj" );
out.close();
return 0;
}
SurfaceMesh< RealPoint, RealVector > SMesh
Z3i this namespace gathers the standard of types for 3D imagery.
Aim: a geometric kernel to compute the convex hull of digital points with integer-only arithmetic.
Aim: Implements the quickhull algorithm by Barber et al. barber1996, a famous arbitrary dimensional c...
bool setInput(const std::vector< InputPoint > &input_points, bool remove_duplicates=true)
bool getFacetVertices(std::vector< IndexRange > &facet_vertices) const
bool getVertexPositions(std::vector< OutputPoint > &vertex_positions)
bool computeConvexHull(Status target=Status::VerticesCompleted)
std::vector< double > timings
Timings of the different phases: 0: init, 1: facets, 2: vertices.
static bool writeOBJ(std::ostream &output, const SurfaceMesh &smesh)
Aim: Represents an embedded mesh as faces and a list of vertices. Vertices may be shared among faces ...