46#include "DGtal/base/Common.h"
47#include "DGtal/helpers/StdDefs.h"
48#include "DGtal/geometry/volumes/DigitalConvexity.h"
55template <
typename Po
int>
58 for (
Dimension i = 0; i < Point::dimension; i++ )
59 p[ i ] = rand() % width;
62template <
typename Po
int>
66 for (
int i = 0; i < nb; i++ )
70template <
typename ProjectedPo
int,
typename Po
int >
74 for (
Dimension i = 0; i < Point::dimension; i++ )
75 if ( i != a ) pp[ j++ ] = p[ i ];
78template <
typename ProjectedPo
int,
typename Po
int >
80 const std::vector< Point > & p,
Dimension a )
82 pp.resize( p.size() );
83 for (
auto i = 0; i < p.size(); i++ )
85 std::sort( pp.begin(), pp.end() );
86 auto last = std::unique( pp.begin(), pp.end() );
87 pp.erase( last, pp.end() );
92template <
typename Space>
102 Point lo = Point::zero;
103 Point hi = Point::diagonal( width );
104 DConvexity dconv( lo, hi );
105 std::vector< Point > X;
108 auto C = dconv.StarCvxH( X );
109 auto E = dconv.envelope( X );
110 auto Y = C.extremaOfCells();
111 bool ok1 = dconv.isFullyConvex( E );
113 trace.warning() <<
"FC*(X) is not fully convex !" << std::endl;
114 bool ok2 = dconv.isFullyConvex( Y );
117 trace.warning() <<
"Extr(Star(CvxH(X))) is not fully convex !" << std::endl;
118 for (
auto p : Y ) std::cout <<
" " << p;
119 trace.warning() << std::endl;
121 bool ok3 = std::includes( Y.cbegin(), Y.cend(), E.cbegin(), E.cend() );
122 trace.info() <<
"#X=" << X.size()
123 <<
" #FC*(X)=" << E.size() << ( ok1 ?
"/FC" :
"/ERROR" )
124 <<
" #Extr(Star(CvxH(X)))=" << Y.size()
125 << ( ok2 ?
"/FC" :
"/ERROR" )
126 << ( ok3 ?
" FC*(X) subset Extr(Star(CvxH(X)))" :
" Inclusion ERROR" )
128 return ok1 && ok2 && ok3;
132template <
typename Space>
143 Point lo = Point::zero;
144 Point hi = Point::diagonal( width );
145 DConvexity dconv( lo, hi );
146 std::vector< Point > X, XpH, Y;
149 std::sort( X.begin(), X.end() );
152 XpH = dconv.U( k, XpH );
153 auto P = dconv.makePolytope( XpH );
155 auto E = dconv.envelope( X );
156 bool ok1 = dconv.isFullyConvex( E );
158 trace.warning() <<
"FC*(X) is not fully convex !" << std::endl;
159 bool ok2 = dconv.isFullyConvex( Y );
162 trace.warning() <<
"CvxH(X+H) cap Z^d is not fully convex !" << std::endl;
163 for (
auto p : Y ) std::cout <<
" " << p;
164 trace.warning() << std::endl;
166 bool ok3 = std::includes( Y.cbegin(), Y.cend(), E.cbegin(), E.cend() );
167 trace.info() <<
"#X=" << X.size()
168 <<
" #CvxH(X+H) cap Z^d=" << Y.size()
169 << ( ok2 ?
"/FC" :
"/ERROR" )
170 <<
" #FC*(X)=" << E.size() << ( ok1 ?
"/FC" :
"/ERROR" )
171 << ( ok3 ?
" FC*(X) subset CvxH(X+H) cap Z^d"
172 :
" FC*(X) not subset CvxH(X+H) cap Z^d" )
178template <
typename Space>
189 typedef typename ProjKSpace::Point ProjPoint;
193 Point lo = Point::zero;
194 Point hi = Point::diagonal( width );
195 DConvexity dconv( lo, hi );
196 std::vector< Point > X;
199 auto E = dconv.envelope( X );
201 unsigned int nb_ok = 0;
207 ProjDConvexity pdconv( plo,
phi );
208 std::vector< ProjPoint > PE;
210 bool ok = pdconv.isFullyConvex( PE );
212 trace.warning() <<
"Projection is not fully convex !" << std::endl;
215 std::cout <<
"#E=" << E.size() <<
" #Proj(E)=" << PE.size()
216 << (ok ?
"/FC" :
"/ERROR" ) << std::endl;
221template <
typename Po
int>
224 if ( X.empty() )
return;
227 for (
auto&& p : X ) { lo = lo.inf( p ); hi = hi.sup( p ); }
228 auto w = hi[ 0 ] - lo[ 0 ] + 1;
229 auto h = hi[ 1 ] - lo[ 1 ] + 1;
230 for (
int y = 0; y < h; y++ )
232 for (
int x = 0; x < w; x++ )
234 Point q( lo[ 0 ] + x, lo[ 1 ] + y );
235 std::cout << ( std::binary_search( X.cbegin(), X.cend(), q ) ?
"*" :
"." );
237 std::cout << std::endl;
241template <
typename Space>
252 typedef typename ProjKSpace::Point ProjPoint;
256 Point lo = Point::zero;
257 Point hi = Point::diagonal( width );
258 DConvexity dconv( lo, hi );
259 std::vector< Point > X, Y;
262 auto P = dconv.makePolytope( X );
264 const bool cvx = dconv.is0Convex( Y );
265 const bool fc = dconv.isFullyConvex( Y );
267 std::cout <<
"#X=" << Y.size()
268 <<
" " << ( cvx ?
"X C" :
"X NC" )
269 <<
"/" << ( fc ?
"X FC" :
"X NFC" );
275 ProjDConvexity pdconv( plo,
phi );
276 std::vector< ProjPoint > PE;
280 std::cout << std::endl;
283 bool ok = pdconv.isFullyConvex( PE );
284 bool ok0 = pdconv.is0Convex( PE );
285 std::cout <<
"/" << a << ( ok0 ? ( ok ?
"FC" :
"NFC" ) :
"NC" );
286 proj_fc = proj_fc && ok;
288 trace.warning() <<
"Projection is not fully convex !" << std::endl;
291 trace.warning() <<
"X is " << ( fc ?
"FCvx" :
"not FCvx" )
292 <<
"proj(X) " << ( proj_fc ?
"FCvx" :
"not FCvx" )
294 else std::cout << ( fc ?
" => FC ok" :
" => Not FC ok" ) << std::endl;
295 return fc == proj_fc;
305 trace.beginBlock(
"Check SkelStarCvxH(X) full convexity 2D" );
308 unsigned int nb_ok = 0;
309 for (
int i = 0; i < NB_TEST1; i++ )
314 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
318 trace.beginBlock(
"Check SkelStarCvxH(X) full convexity 3D" );
321 unsigned int nb_ok = 0;
322 for (
int i = 0; i < NB_TEST1; i++ )
327 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
331 trace.beginBlock(
"Check SkelStarCvxH(X) full convexity 4D" );
334 unsigned int nb_ok = 0;
335 for (
int i = 0; i < NB_TEST1; i++ )
340 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
344 trace.beginBlock(
"Check Projection full convexity 3D" );
347 unsigned int nb_ok = 0;
348 for (
int i = 0; i < NB_TEST2; i++ )
353 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
357 trace.beginBlock(
"Check Projection full convexity 4D" );
360 unsigned int nb_ok = 0;
361 for (
int i = 0; i < NB_TEST2; i++ )
366 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
370 trace.beginBlock(
"Check CvxH plus Hypercube full convexity 2D" );
373 unsigned int nb_ok = 0;
374 for (
int i = 0; i < NB_TEST3; i++ )
379 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
383 trace.beginBlock(
"Check CvxH plus Hypercube full convexity 3D" );
386 unsigned int nb_ok = 0;
387 for (
int i = 0; i < NB_TEST3; i++ )
392 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
396 trace.beginBlock(
"Check CvxH plus Hypercube full convexity 4D" );
399 unsigned int nb_ok = 0;
400 for (
int i = 0; i < NB_TEST3; i++ )
405 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
409 trace.beginBlock(
"Check full convexity characterization 3D" );
412 unsigned int nb_ok = 0;
413 for (
int i = 0; i < NB_TEST4; i++ )
418 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
422 trace.beginBlock(
"Check full convexity characterization 4D" );
425 unsigned int nb_ok = 0;
426 for (
int i = 0; i < NB_TEST4; i++ )
431 trace.info() << nb_ok <<
"/" << nb <<
" OK tests" << std::endl;
void makeRandomRange(std::vector< Point > &X, int nb, int width)
void projectRange(std::vector< ProjectedPoint > &pp, const std::vector< Point > &p, Dimension a)
bool checkSkelStarCvxHFullConvexity(int width)
void makeRandom(Point &p, int width)
bool checkProjectionFullConvexity(int width)
bool checkFullConvexityCharacterization(int width)
void project(ProjectedPoint &pp, const Point &p, Dimension a)
bool checkCvxHPlusHypercubeFullConvexity(int width)
void displayPointRange2D(const std::vector< Point > &X)
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
PointVector< dim, Integer > Point
static const Dimension dimension
PolygonalCalculus< SH3::RealPoint, SH3::RealVector >::Vector phi(const Face f)
Point::Coordinate Integer
DGtal is the top-level namespace which contains all DGtal functions and types.
DGtal::uint32_t Dimension