DGtal  1.5.beta
exampleBoundedLatticePolytopeCount4D.cpp
Go to the documentation of this file.
1 
58 #include "DGtal/base/Common.h"
59 #include "DGtal/geometry/volumes/ConvexityHelper.h"
60 #include "DGtal/geometry/volumes/BoundedLatticePolytope.h"
61 
62 int main( int argc, char* argv[] )
63 {
64  int N = argc > 1 ? atoi( argv[ 1 ] ) : 10; // nb of polytopes
65  int nb = argc > 2 ? atoi( argv[ 2 ] ) : 10; // nb points per polytope
66  int R = argc > 3 ? atoi( argv[ 3 ] ) : 50; // max diameter of shape
67 
68  typedef int64_t Integer;
70  typedef Helper::LatticePolytope Polytope;
71  typedef Polytope::Point Point;
72  // Compute all polytopes
73  DGtal::trace.beginBlock( "Compute 4D polytopes" );
74  std::vector< Polytope > polytopes;
75  int sum_nb_facets = 0;
76  for ( int i = 0; i < N; i++ )
77  {
78  std::vector< Point > V;
79  for ( int i = 0; i < nb; i++ ) {
80  Point p( rand() % (2*R+1) - R, rand() % (2*R+1) - R,
81  rand() % (2*R+1) - R, rand() % (2*R+1) - R );
82  V.push_back( p );
83  }
84  Polytope P = Helper::computeLatticePolytope( V );
85  sum_nb_facets += P.nbHalfSpaces();
86  polytopes.push_back( P );
87  }
88  double t1 = DGtal::trace.endBlock();
89  DGtal::trace.info() << "Computed " << N
90  << " 4D polytopes with " << ( sum_nb_facets / (double) N )
91  << " facets on average, in " << t1 << " ms." << std::endl;
92  // Count interior points (slow method)
93  DGtal::trace.beginBlock( "Compute number of lattice points within polytope (slow)" );
94  std::size_t slow_nb = 0;
95  std::vector< Integer > slow_counts;
96  for ( const auto& P : polytopes )
97  {
98  const auto nb = P.countByScanning();
99  slow_nb += nb;
100  slow_counts.push_back( nb );
101  }
102  double t2 = DGtal::trace.endBlock();
103  // Count interior points (fast method)
104  DGtal::trace.beginBlock( "Compute number of lattice points within polytope (fast)" );
105  std::size_t fast_nb = 0;
106  std::vector< Integer > fast_counts;
107  for ( const auto& P : polytopes )
108  {
109  const auto nb = P.count();
110  fast_nb += nb;
111  fast_counts.push_back( nb );
112  }
113  double t3 = DGtal::trace.endBlock();
114  bool ok = std::equal( slow_counts.cbegin(), slow_counts.cend(), fast_counts.cbegin() );
115  DGtal::trace.info() << "Computed inside points is " << ( ok ? "OK" : "ERROR" ) << std::endl;
116  DGtal::trace.info() << "Reference method computed " << slow_nb
117  << " points in " << t2 << " ms." << std::endl;
118  DGtal::trace.info() << "Fast method computed " << fast_nb
119  << " points in " << t3 << " ms." << std::endl;
120  return 0;
121 }
122 
void beginBlock(const std::string &keyword="")
std::ostream & info()
double endBlock()
int main(int argc, char *argv[])
Trace trace
Definition: Common.h:153
Aim: Provides a set of functions to facilitate the computation of convex hulls and polytopes,...
MyPointD Point
Definition: testClone2.cpp:383