DGtal 1.3.0
Loading...
Searching...
No Matches
exampleRationalBallQuickHull3D.cpp
Go to the documentation of this file.
1
53#include "DGtal/base/Common.h"
55#include "DGtal/geometry/tools/QuickHull.h"
57#include "DGtal/shapes/SurfaceMesh.h"
58#include "DGtal/io/writers/SurfaceMeshWriter.h"
59
60double rand01() { return (double) rand() / (double) RAND_MAX; }
61
62using namespace DGtal::Z3i;
63int main( int argc, char* argv[] )
64{
65 int nb = argc > 1 ? atoi( argv[ 1 ] ) : 100; // nb points
66 double R = argc > 2 ? atof( argv[ 2 ] ) : 10.0; // radius of ball
67 double precision = argc > 3 ? atof( argv[ 3 ] ) : 1024.0; // precision
68 // (0) typedefs
73 // (1) create range of random points in ball
74 std::vector< RealPoint > V;
75 const double R2 = R * R;
76 for ( int i = 0; i < nb; ) {
77 RealPoint p( rand01()*2.0*R - R, rand01()*2.0*R - R, rand01()*2.0*R - R );
78 if ( p.squaredNorm() < R2 ) { V.push_back( p ); i++; }
79 }
80 // (2) compute convex hull
82 Kernel3D kernel( precision );
83 QuickHull3D hull( kernel );
84 hull.setInput( V );
85 hull.computeConvexHull();
86 std::cout << "#points=" << hull.nbPoints()
87 << " #vertices=" << hull.nbVertices()
88 << " #facets=" << hull.nbFacets() << std::endl;
91 double total_time = 0;
92 std::for_each( hull.timings.cbegin(), hull.timings.cend(),
93 [&total_time] ( double t ) { total_time += t; } );
94 std::cout << "purge duplicates= " << round(hull.timings[ 0 ]) << " ms." << std::endl;
95 std::cout << "init simplex = " << round(hull.timings[ 1 ]) << " ms." << std::endl;
96 std::cout << "quickhull core = " << round(hull.timings[ 2 ]) << " ms." << std::endl;
97 std::cout << "compute vertices= " << round(hull.timings[ 3 ]) << " ms." << std::endl;
98 std::cout << "total time = " << round(total_time) << " ms." << std::endl;
100 // (3) build mesh
102 std::vector< RealPoint > positions;
103 hull.getVertexPositions( positions );
104 std::vector< std::vector< std::size_t > > facets;
105 hull.getFacetVertices( facets );
107 SMesh mesh( positions.cbegin(), positions.cend(), facets.cbegin(), facets.cend() );
109 // (4) output result as OBJ file
111 std::ofstream out( "qhull.obj" );
113 out.close();
115 return 0;
116}
117
Aim: Implements basic operations that will be used in Point and Vector classes.
Definition: PointVector.h:593
double rand01()
[QuickHull3D-Includes]
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: a geometric kernel to compute the convex hull of floating points with integer-only arithmetic....
Aim: Implements the quickhull algorithm by Barber et al. , a famous arbitrary dimensional convex hull...
Definition: QuickHull.h:140
bool setInput(const std::vector< InputPoint > &input_points, bool remove_duplicates=true)
Definition: QuickHull.h:382
bool getFacetVertices(std::vector< IndexRange > &facet_vertices) const
Definition: QuickHull.h:666
Size nbVertices() const
Definition: QuickHull.h:337
bool getVertexPositions(std::vector< OutputPoint > &vertex_positions)
Definition: QuickHull.h:612
Size nbFacets() const
Definition: QuickHull.h:328
bool computeConvexHull(Status target=Status::VerticesCompleted)
Definition: QuickHull.h:460
std::vector< double > timings
Timings of the different phases: 0: init, 1: facets, 2: vertices.
Definition: QuickHull.h:826
Size nbPoints() const
Definition: QuickHull.h:323
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 ...
Definition: SurfaceMesh.h:92
int main()
Definition: testBits.cpp:56