31 #include "DGtal/io/Color.h"
43 template < Dimension dim,
typename TInteger >
47 template < Dimension dim,
typename TInteger >
51 template < Dimension dim,
typename TInteger >
64 template < Dimension dim,
typename TInteger >
70 template < Dimension dim,
typename TInteger >
74 : myCoordinates( other.myCoordinates )
78 template < Dimension dim,
typename TInteger >
86 template < Dimension dim,
typename TInteger >
97 template < Dimension dim,
typename TInteger >
106 template < Dimension dim,
typename TInteger >
115 template < Dimension dim,
typename TInteger >
124 template < Dimension dim,
typename TInteger >
130 out <<
"(" <<
object.myCoordinates[ 0 ];
132 out <<
"," <<
object.myCoordinates[ i ];
138 template < Dimension dim,
typename TInteger >
144 return "KhalimskyCell";
151 template < Dimension dim,
typename TInteger >
157 template < Dimension dim,
typename TInteger >
161 : myCoordinates( other.myCoordinates), myPositive( other.myPositive )
165 template < Dimension dim,
typename TInteger >
169 : myCoordinates( p ), myPositive( positive )
173 template < Dimension dim,
typename TInteger >
179 if (
this != &other )
187 template < Dimension dim,
typename TInteger >
197 template < Dimension dim,
typename TInteger >
207 template < Dimension dim,
typename TInteger >
225 out <<
"(" <<
object.myCoordinates[ 0 ];
227 out <<
"," <<
object.myCoordinates[ i ];
228 out <<
"," << (
object.myPositive ?
'+' :
'-' );
234 template < Dimension dim,
typename TInteger >
240 return "SignedKhalimskyCell";
247 template < Dimension dim,
typename TInteger >
251 : myDir( 0 ), myCell( cell ), myOpen( open )
256 template < Dimension dim,
typename TInteger >
260 : myDir( 0 ), myCell( scell.myCoordinates ), myOpen( open )
265 template < Dimension dim,
typename TInteger >
274 template < Dimension dim,
typename TInteger >
285 template < Dimension dim,
typename TInteger >
294 template < Dimension dim,
typename TInteger >
303 template < Dimension dim,
typename TInteger >
309 return myDir != other.
myDir;
312 template < Dimension dim,
typename TInteger >
318 return myDir == other.
myDir;
321 template < Dimension dim,
typename TInteger >
328 while ( ( myDir != dim )
329 && ( ( myCell.myCoordinates[ myDir ] & 0x1 ) == 0 ) )
332 while ( ( myDir != dim )
333 && ( myCell.myCoordinates[ myDir ] & 0x1 ) )
344 template < Dimension dim,
typename TInteger>
351 template < Dimension dim,
typename TInteger>
357 for (
Dimension i = 0; i < dimension; ++i )
362 init( low, high,
true );
365 template < Dimension dim,
typename TInteger>
369 : myLower(other.myLower), myUpper(other.myUpper),
370 myCellLower(other.myCellLower), myCellUpper(other.myCellUpper),
371 myIsClosed(other.myIsClosed) { }
373 template < Dimension dim,
typename TInteger>
379 if (
this != &other )
390 template < Dimension dim,
typename TInteger>
403 for (
Dimension i = 0; i < dimension; ++i )
412 for (
Dimension i = 0; i < dimension; ++i )
414 myCellLower.myCoordinates[ i ] = ( lower[ i ] * 2 )
415 + ( closed ? 0 : 1 );
416 myCellUpper.myCoordinates[ i ] = ( upper[ i ] * 2 )
417 + ( closed ? 2 : 1 );
422 template < Dimension dim,
typename TInteger>
428 ASSERT( k < dimension );
432 template < Dimension dim,
typename TInteger>
441 template < Dimension dim,
typename TInteger>
450 template < Dimension dim,
typename TInteger>
459 template < Dimension dim,
typename TInteger>
468 template < Dimension dim,
typename TInteger>
477 template < Dimension dim,
typename TInteger>
486 template < Dimension dim,
typename TInteger>
496 template < Dimension dim,
typename TInteger>
505 template < Dimension dim,
typename TInteger>
517 template < Dimension dim,
typename TInteger>
523 return SCell( kp, sign == POS );
526 template < Dimension dim,
typename TInteger>
538 template < Dimension dim,
typename TInteger>
550 template < Dimension dim,
typename TInteger>
562 template < Dimension dim,
typename TInteger>
574 template < Dimension dim,
typename TInteger>
588 template < Dimension dim,
typename TInteger>
598 template < Dimension dim,
typename TInteger>
608 template < Dimension dim,
typename TInteger>
617 template < Dimension dim,
typename TInteger>
629 template < Dimension dim,
typename TInteger>
639 template < Dimension dim,
typename TInteger>
649 template < Dimension dim,
typename TInteger>
658 template < Dimension dim,
typename TInteger>
670 template < Dimension dim,
typename TInteger>
679 template < Dimension dim,
typename TInteger>
688 template < Dimension dim,
typename TInteger>
697 template < Dimension dim,
typename TInteger>
706 template < Dimension dim,
typename TInteger>
713 && myCellLower.myCoordinates[ k ] <= i
714 && i <= myCellUpper.myCoordinates[ k ] );
718 template < Dimension dim,
typename TInteger>
725 && myCellLower.myCoordinates[ k ] <= i
726 && i <= myCellUpper.myCoordinates[ k ] );
730 template < Dimension dim,
typename TInteger>
738 ASSERT( myCellLower.myCoordinates[ k ] <= i
739 && i <= myCellUpper.myCoordinates[ k ] );
743 template < Dimension dim,
typename TInteger>
751 ASSERT( myCellLower.myCoordinates[ k ] <= i
752 && i <= myCellUpper.myCoordinates[ k ] );
756 template < Dimension dim,
typename TInteger>
765 template < Dimension dim,
typename TInteger>
774 template < Dimension dim,
typename TInteger>
784 ASSERT( myCellLower.myCoordinates[ k ] <= i
785 && i <= myCellUpper.myCoordinates[ k ] );
790 template < Dimension dim,
typename TInteger>
800 ASSERT( myCellLower.myCoordinates[ k ] <= i
801 && i <= myCellUpper.myCoordinates[ k ] );
806 template < Dimension dim,
typename TInteger>
817 template < Dimension dim,
typename TInteger>
834 template < Dimension dim,
typename TInteger>
851 template < Dimension dim,
typename TInteger>
864 template < Dimension dim,
typename TInteger>
877 template < Dimension dim,
typename TInteger>
883 return uDim( b ) == ( DIM - 1 );
886 template < Dimension dim,
typename TInteger>
892 return sDim( b ) == ( DIM - 1 );
895 template < Dimension dim,
typename TInteger>
904 template < Dimension dim,
typename TInteger>
916 template < Dimension dim,
typename TInteger>
925 template < Dimension dim,
typename TInteger>
934 template < Dimension dim,
typename TInteger>
943 template < Dimension dim,
typename TInteger>
952 template < Dimension dim,
typename TInteger>
959 ASSERT( ! it.
end() );
963 template < Dimension dim,
typename TInteger>
970 ASSERT( ! it.
end() );
977 template < Dimension dim,
typename TInteger>
983 return uCell( myLower, p );
986 template < Dimension dim,
typename TInteger>
992 return uCell( myUpper, p );
995 template < Dimension dim,
typename TInteger>
1006 template < Dimension dim,
typename TInteger>
1012 return p.
myCoordinates[ k ] >= myCellUpper.myCoordinates[ k ];
1015 template < Dimension dim,
typename TInteger>
1021 return (p.
myCoordinates[ k ] <= uLast(p).myCoordinates[ k ]) &&
1025 template < Dimension dim,
typename TInteger>
1031 return uProjection( p, uLast(p), k );
1035 template < Dimension dim,
typename TInteger>
1046 template < Dimension dim,
typename TInteger>
1052 return p.
myCoordinates[ k ] <= myCellLower.myCoordinates[ k ];
1055 template < Dimension dim,
typename TInteger>
1061 return uProjection( p, uFirst(p), k );
1065 template < Dimension dim,
typename TInteger>
1076 template < Dimension dim,
typename TInteger>
1087 template < Dimension dim,
typename TInteger>
1093 return ( myCellUpper.myCoordinates[ k ] - p.
myCoordinates[ k ] ) >> 1;
1096 template < Dimension dim,
typename TInteger>
1102 return ( p.
myCoordinates[ k ] - myCellLower.myCoordinates[ k ] ) >> 1;
1105 template < Dimension dim,
typename TInteger>
1117 template < Dimension dim,
typename TInteger>
1128 template < Dimension dim,
typename TInteger>
1137 template < Dimension dim,
typename TInteger>
1144 if ( uCoord( p, k ) == uCoord( upper, k ) )
1146 if ( p == upper )
return false;
1147 uProject( p, lower, k );
1148 for ( k = 1; k < DIM; ++k )
1150 if ( uCoord( p, k ) == uCoord( upper, k ) )
1151 uProject( p, lower, k );
1168 template < Dimension dim,
typename TInteger>
1174 return sCell( myLower, p );
1177 template < Dimension dim,
typename TInteger>
1183 return sCell( myUpper, p );
1186 template < Dimension dim,
typename TInteger>
1197 template < Dimension dim,
typename TInteger>
1203 return p.
myCoordinates[ k ] >= myCellUpper.myCoordinates[ k ];
1206 template < Dimension dim,
typename TInteger>
1212 return (p.
myCoordinates[ k ] <= sLast(p).myCoordinates[ k ]) &&
1216 template < Dimension dim,
typename TInteger>
1222 return sProjection( p, sLast(p), k );
1226 template < Dimension dim,
typename TInteger>
1237 template < Dimension dim,
typename TInteger>
1243 return p.
myCoordinates[ k ] <= myCellLower.myCoordinates[ k ];
1246 template < Dimension dim,
typename TInteger>
1252 return sProjection( p, sFirst(p), k );
1256 template < Dimension dim,
typename TInteger>
1267 template < Dimension dim,
typename TInteger>
1278 template < Dimension dim,
typename TInteger>
1284 return ( myCellUpper.myCoordinates[ k ] - p.
myCoordinates[ k ] ) >> 1;
1287 template < Dimension dim,
typename TInteger>
1293 return ( p.
myCoordinates[ k ] - myCellLower.myCoordinates[ k ] ) >> 1;
1296 template < Dimension dim,
typename TInteger>
1308 template < Dimension dim,
typename TInteger>
1319 template < Dimension dim,
typename TInteger>
1328 template < Dimension dim,
typename TInteger>
1335 if ( sCoord( p, k ) == sCoord( upper, k ) )
1337 if ( p == upper )
return false;
1338 sProject( p, lower, k );
1339 for ( k = 1; k < DIM; ++k )
1341 if ( sCoord( p, k ) == sCoord( upper, k ) )
1342 sProject( p, lower, k );
1358 template < Dimension dim,
typename TInteger>
1368 if ( ! uIsMin( c, k ) )
1369 N.push_back( uGetDecr( c, k ) );
1370 if ( ! uIsMax( c, k ) )
1371 N.push_back( uGetIncr( c, k ) );
1376 template < Dimension dim,
typename TInteger>
1386 if ( ! sIsMin( c, k ) )
1387 N.push_back( sGetDecr( c, k ) );
1388 if ( ! sIsMax( c, k ) )
1389 N.push_back( sGetIncr( c, k ) );
1394 template < Dimension dim,
typename TInteger>
1403 if ( ! uIsMin( c, k ) )
1404 N.push_back( uGetDecr( c, k ) );
1405 if ( ! uIsMax( c, k ) )
1406 N.push_back( uGetIncr( c, k ) );
1411 template < Dimension dim,
typename TInteger>
1420 if ( ! sIsMin( c, k ) )
1421 N.push_back( sGetDecr( c, k ) );
1422 if ( ! sIsMax( c, k ) )
1423 N.push_back( sGetIncr( c, k ) );
1428 template < Dimension dim,
typename TInteger>
1434 return up ? uGetIncr( p, k ) : uGetDecr( p, k );
1437 template < Dimension dim,
typename TInteger>
1443 return up ? sGetIncr( p, k ) : sGetDecr( p, k );
1448 template < Dimension dim,
typename TInteger>
1455 ASSERT( ( ! up ) || ( uKCoord( c, k ) < uKCoord( myCellUpper, k ) ) );
1456 ASSERT( ( up ) || ( uKCoord( myCellLower, k ) < uKCoord( c, k ) ) );
1463 template < Dimension dim,
typename TInteger>
1470 ASSERT( ( ! up ) || ( sKCoord( c, k ) < uKCoord( myCellUpper, k ) ) );
1471 ASSERT( ( up ) || ( uKCoord( myCellLower, k ) < sKCoord( c, k ) ) );
1475 if ( sIsOpen( d, i ) )
1483 template < Dimension dim,
typename TInteger>
1494 if ( uKCoord( myCellLower, k ) < x )
1495 N.push_back( uIncident( c, k,
false ) );
1496 if ( x < uKCoord( myCellUpper, k ) )
1497 N.push_back( uIncident( c, k,
true ) );
1502 template < Dimension dim,
typename TInteger>
1509 for (
DirIterator q = uOrthDirs( c ); q != 0; ++q )
1513 if ( uKCoord( myCellLower, k ) < x )
1514 N.push_back( uIncident( c, k,
false ) );
1515 if ( x < uKCoord( myCellUpper, k ) )
1516 N.push_back( uIncident( c, k,
true ) );
1521 template < Dimension dim,
typename TInteger>
1532 if ( uKCoord( myCellLower, k ) < x )
1533 N.push_back( sIncident( c, k,
false ) );
1534 if ( x < uKCoord( myCellUpper, k ) )
1535 N.push_back( sIncident( c, k,
true ) );
1540 template < Dimension dim,
typename TInteger>
1547 for (
DirIterator q = sOrthDirs( c ); q != 0; ++q )
1551 if ( uKCoord( myCellLower, k ) < x )
1552 N.push_back( sIncident( c, k,
false ) );
1553 if ( x < uKCoord( myCellUpper, k ) )
1554 N.push_back( sIncident( c, k,
true ) );
1559 template < Dimension dim,
typename TInteger>
1568 std::deque<Dimension> Q;
1570 Q.push_back( dim_of_c );
1571 while ( ! P.empty() )
1573 Cell d = P.front(); P.pop_front();
1575 if ( k != dim_of_c ) N.push_back( d );
1577 for (
DirIterator q = uDirs( d ); ( q != 0 ) && ( k > 0 ); ++q, --k )
1579 P.push_back( uIncident( d, *q,
false ) );
1580 Q.push_back( k - 1 );
1581 P.push_back( uIncident( d, *q,
true ) );
1582 Q.push_back( k - 1 );
1588 template < Dimension dim,
typename TInteger>
1597 std::deque<Dimension> Q;
1599 Q.push_back( dimension - dim_of_c );
1600 while ( ! P.empty() )
1602 Cell d = P.front(); P.pop_front();
1604 if ( k != dim_of_c ) N.push_back( d );
1606 for (
DirIterator q = uOrthDirs( d ); ( q != 0 ) && ( k > 0 ); ++q, --k )
1608 P.push_back( uIncident( d, *q,
false ) );
1609 Q.push_back( k - 1 );
1610 P.push_back( uIncident( d, *q,
true ) );
1611 Q.push_back( k - 1 );
1617 template < Dimension dim,
typename TInteger>
1626 if ( sIsOpen( p, i ) )
1631 template < Dimension dim,
typename TInteger>
1641 if ( sIsOpen( d, i ) )
1646 ASSERT( ( ! up ) || ( sKCoord( d, k ) < uKCoord( myCellUpper, k ) ) );
1647 ASSERT( ( up ) || ( uKCoord( myCellLower, k ) < sKCoord( d, k ) ) );
1654 template < Dimension dim,
typename TInteger>
1664 if ( sIsOpen( d, i ) )
1669 ASSERT( ( ! up ) || ( sKCoord( d, k ) < uKCoord( myCellUpper, k ) ) );
1670 ASSERT( ( up ) || ( uKCoord( myCellLower, k ) < sKCoord( d, k ) ) );
1682 template < Dimension dim,
typename TInteger>
1688 out <<
"[KhalimskySpaceND]";
1691 template < Dimension dim,
typename TInteger>
1704 template < Dimension dim,
typename TInteger>
1710 object.selfDisplay( out );