DGtal 2.1.0
Loading...
Searching...
No Matches
TiledImage.h
1
17#pragma once
18
31#if defined(TiledImage_RECURSES)
32#error Recursive header files inclusion detected in TiledImage.h
33#else // defined(TiledImage_RECURSES)
35#define TiledImage_RECURSES
36
37#if !defined TiledImage_h
39#define TiledImage_h
40
42// Inclusions
43#include <iostream>
44#include "DGtal/base/Common.h"
45#include "DGtal/base/ConceptUtils.h"
46#include "DGtal/images/CImage.h"
47#include "DGtal/images/CImageFactory.h"
48#include "DGtal/images/CImageCacheReadPolicy.h"
49#include "DGtal/images/CImageCacheWritePolicy.h"
50#include "DGtal/base/Alias.h"
51
52#include "DGtal/images/ImageCache.h"
53
54#include "DGtal/base/TiledImageBidirectionalConstRangeFromPoint.h"
55#include "DGtal/base/TiledImageBidirectionalRangeFromPoint.h"
56
57#include "boost/iterator/reverse_iterator.hpp"
59
60namespace DGtal
61{
63 // Template class TiledImage
77 template <typename TImageContainer, typename TImageFactory, typename TImageCacheReadPolicy, typename TImageCacheWritePolicy>
79 {
80
81 // ----------------------- Types ------------------------------
82
83 public:
85
91
94 typedef typename ImageContainer::Domain Domain;
95 typedef typename ImageContainer::Point Point;
96 typedef typename ImageContainer::Value Value;
97
98 typedef typename ImageContainer::Difference Difference;
99
101 typedef TImageFactory ImageFactory;
102 typedef typename ImageFactory::OutputImage OutputImage;
103
104 typedef TImageCacheReadPolicy ImageCacheReadPolicy;
105 typedef TImageCacheWritePolicy ImageCacheWritePolicy;
107
108 // ----------------------- Standard services ------------------------------
109
110 public:
111
120 Alias<ImageCacheReadPolicy> aReadPolicy,
121 Alias<ImageCacheWritePolicy> aWritePolicy,
122 typename Domain::Integer N):
123 myN(N), myImageFactory(&anImageFactory), myReadPolicy(&aReadPolicy), myWritePolicy(&aWritePolicy)
124 {
126
127 m_lowerBound = myImageFactory->domain().lowerBound();
128 m_upperBound = myImageFactory->domain().upperBound();
129
130 for(typename DGtal::Dimension i=0; i<Domain::dimension; i++)
131 mySize[i] = (m_upperBound[i]-m_lowerBound[i]+1)/myN;
132 }
133
138 {
139 delete myImageCache;
140 }
141
142 private:
143
144 public:
145
150 TiledImage( const TiledImage &other )
151 {
152 myN = other.myN;
156
158
159 m_lowerBound = myImageFactory->domain().lowerBound();
160 m_upperBound = myImageFactory->domain().upperBound();
161
162 for(typename DGtal::Dimension i=0; i<Domain::dimension; i++)
163 mySize[i] = (m_upperBound[i]-m_lowerBound[i]+1)/myN;
164 }
165
171 TiledImage & operator=( const TiledImage & other )
172 {
173 if ( this != &other )
174 {
175 myN = other.myN;
179
181
182 m_lowerBound = myImageFactory->domain().lowerBound();
183 m_upperBound = myImageFactory->domain().upperBound();
184
185 for(typename DGtal::Dimension i=0; i<Domain::dimension; i++)
186 mySize[i] = (m_upperBound[i]-m_lowerBound[i]+1)/myN;
187 }
188
189 return *this;
190 }
191
192 // ----------------------- Interface --------------------------------------
193 public:
194
196
202 const Domain & domain() const
203 {
204 return myImageFactory->domain();
205 }
206
213 {
214 Point lowerBoundCords, upperBoundCoords;
215
216 for(typename DGtal::Dimension i=0; i<Domain::dimension; i++)
217 {
218 lowerBoundCords[i] = 0;
219 upperBoundCoords[i] = myN;
220
221 if (((m_upperBound[i]-m_lowerBound[i]+1) % myN) == 0)
222 upperBoundCoords[i]--;
223 }
224
225 return Domain(lowerBoundCords, upperBoundCoords);
226 }
227
229
235 {
236
238
239 public:
240
241 using iterator_category = std::bidirectional_iterator_tag;
243 using difference_type = ptrdiff_t;
244 using pointer = Value*;
245 using reference = Value&;
246
247 typedef typename ImageContainer::Range::/*Output*/Iterator TiledRangeIterator;
249
250 //TiledIterator();
251
258 TiledIterator ( BlockCoordsIterator aBlockCoordsIterator,
260 ImageCacheReadPolicy, ImageCacheWritePolicy> *aTiledImage ) : myTiledImage ( aTiledImage ),
261 myBlockCoordsIterator ( aBlockCoordsIterator )
262 {
264 {
266 myTiledRangeIterator = myTile->range().begin();
267 }
268 }
269
277 TiledIterator ( BlockCoordsIterator aBlockCoordsIterator,
278 const Point& aPoint,
280 ImageCacheReadPolicy, ImageCacheWritePolicy> *aTiledImage ) : myTiledImage ( aTiledImage ),
281 myBlockCoordsIterator ( aBlockCoordsIterator )
282 {
284 {
286 myTiledRangeIterator = myTile->range().begin(aPoint);
287 }
288 }
289
295 inline
297 {
298 return (*myTiledRangeIterator);
299 }
300
306 inline
307 bool operator== ( const TiledIterator &it ) const
308 {
309 return ( ( this->myBlockCoordsIterator == it.myBlockCoordsIterator ) && ( this->myTiledRangeIterator == it.myTiledRangeIterator ) );
310 }
311
317 inline
318 bool operator!= ( const TiledIterator &it ) const
319 {
321 return false;
322
323 return ( ( this->myBlockCoordsIterator != it.myBlockCoordsIterator ) || ( this->myTiledRangeIterator != it.myTiledRangeIterator ) );
324 }
325
330 inline
332 {
334
335 if ( myTiledRangeIterator != myTile->range().end() )
336 return;
337 else
338 {
340
342 return;
343
345 myTiledRangeIterator = myTile->range().begin();
346 }
347 }
348
353 inline
355 {
357 return *this;
358 }
359
364 inline
366 {
367 TiledIterator tmp = *this;
369 return tmp;
370 }
371
376 inline
378 {
379 // -- IF we are at the end... (reverse, --)
381 {
383
385
386 myTiledRangeIterator = myTile->range().end();
388
389 return;
390 }
391 // -- IF we are at the end... (reverse, --)
392
393 // ---
394
395 if ( myTiledRangeIterator != myTile->range().begin() )
396 {
398 return;
399 }
400 else
401 {
403 return;
404
406
408
409 myTiledRangeIterator = myTile->range().end();
411 }
412 }
413
418 inline
420 {
422 return *this;
423 }
424
428 inline
430 {
431 TiledIterator tmp = *this;
433 return tmp;
434 }
435
436 private:
439
442
445
448 };
449
450
453
454 typedef boost::reverse_iterator<TiledIterator> ReverseTiledIterator;
457
458
460 {
461 return TiledIterator( this->domainBlockCoords().begin(), this );
462 }
463
464 OutputIterator begin()
465 {
466 return TiledIterator( this->domainBlockCoords().begin(), this );
467 }
468
469 ConstIterator begin(const Point& aPoint) const
470 {
471 Point coords = this->findBlockCoordsFromPoint(aPoint);
472 return TiledIterator( this->domainBlockCoords().begin(coords), aPoint, this );
473 }
474
476 {
477 Point coords = this->findBlockCoordsFromPoint(aPoint);
478 return TiledIterator( this->domainBlockCoords().begin(coords), aPoint, this );
479 }
480
482 {
483 return TiledIterator( this->domainBlockCoords().end(), this );
484 }
485
486 OutputIterator end()
487 {
488 return TiledIterator( this->domainBlockCoords().end(), this );
489 }
490
491 ConstReverseIterator rbegin() const
492 {
493 return ReverseTiledIterator( end() );
494 }
495
497 {
498 return ReverseTiledIterator( end() );
499 }
500
502 {
503 typename DGtal::Dimension i;
504
505 Point point2;
506 for(i=0; i<Domain::dimension; i++)
507 point2[i]=(m_upperBound[i]-aPoint[i])+m_lowerBound[i];
508
509 TiledIterator it( begin(point2) ); it++;
510 return ReverseTiledIterator(it);
511 }
512
514 {
515 typename DGtal::Dimension i;
516
517 Point point2;
518 for(i=0; i<Domain::dimension; i++)
519 point2[i]=(m_upperBound[i]-aPoint[i])+m_lowerBound[i];
520
521 TiledIterator it( begin(point2) ); it++;
522 return ReverseTiledIterator(it);
523 }
524
526 {
527 return ReverseTiledIterator( begin() );
528 }
529
531 {
532 return ReverseTiledIterator( begin() );
533 }
534
535 // ---
536
538 {
539 return OutputIterator( begin() );
540 }
541
546
551
556
558
561
567 {
568 return ConstRange( this );
569 }
570
576 {
577 return Range( this );
578 }
579
581
586 void selfDisplay ( std::ostream & out ) const;
587
592 bool isValid() const
593 {
594 return (myImageFactory->isValid() && myImageCache->isValid());
595 }
596
603 const Domain findSubDomain(const Point & aPoint) const
604 {
605 ASSERT(myImageFactory->domain().isInside(aPoint));
606
607 typename DGtal::Dimension i;
608
609 Point low;
610 for(i=0; i<Domain::dimension; i++)
611 {
612 low[i] = (aPoint[i]-m_lowerBound[i])/mySize[i];
613 }
614
615 Point dMin, dMax;
616 for(i=0; i<Domain::dimension; i++)
617 {
618 dMin[i] = (low[i]*mySize[i])+m_lowerBound[i];
619 dMax[i] = dMin[i] + (mySize[i]-1);
620
621 if (dMax[i] > m_upperBound[i]) // last tile
622 dMax[i] = m_upperBound[i];
623 }
624
625 Domain di(dMin, dMax);
626 return di;
627 }
628
636 {
637 ASSERT(myImageFactory->domain().isInside(aPoint));
638
639 typename DGtal::Dimension i;
640
641 Point low;
642 for(i=0; i<Domain::dimension; i++)
643 {
644 /*if ( (aPoint[i]-m_lowerBound[i]) < mySize[i] )
645 low[i] = 0;
646 else*/
647 low[i] = (aPoint[i]-m_lowerBound[i])/mySize[i];
648 }
649
650 return low;
651 }
652
659 const Domain findSubDomainFromBlockCoords(const Point & aCoord) const
660 {
661 ASSERT(domainBlockCoords().isInside(aCoord));
662
663 typename DGtal::Dimension i;
664
665 Point dMin, dMax;
666 for(i=0; i<Domain::dimension; i++)
667 {
668 dMin[i] = (aCoord[i]*mySize[i])+m_lowerBound[i];
669 dMax[i] = dMin[i] + (mySize[i]-1);
670
671 if (dMax[i] > m_upperBound[i]) // last tile
672 dMax[i] = m_upperBound[i];
673 }
674
675 Domain di(dMin, dMax);
676 return di;
677 }
678
686 {
687 ASSERT(domainBlockCoords().isInside(aCoord));
688
691 if (!tile)
692 {
695 tile = myImageCache->getPage(d);
696 }
697
698 return tile;
699 }
700
708 {
709 ASSERT(myImageFactory->domain().isInside(aPoint));
710
711 typename OutputImage::Value aValue;
712 bool res;
713
714 res = myImageCache->read(aPoint, aValue);
715
716 if (res)
717 return aValue;
718 else
719 {
721 Domain d;
722#ifdef DEBUG_VERBOSE
723 trace.info()<<"+";
724#endif
726
728
729 myImageCache->read(aPoint, aValue);
730
731 return aValue;
732 }
733
734 // Unspecified behavior, returning the default constructed value.
735 return aValue;
736 }
737
744 void setValue(const Point &aPoint, const Value &aValue)
745 {
746 ASSERT(myImageFactory->domain().isInside(aPoint));
747
748 if (myImageCache->write(aPoint, aValue))
749 return;
750 else
751 {
754 myImageCache->write(aPoint, aValue);
755 }
756 }
757
761 unsigned int getCacheMissRead()
762 {
764 }
765
769 unsigned int getCacheMissWrite()
770 {
772 }
773
781
782 // ------------------------- Private Datas --------------------------------
783 protected:
784
787
790
793
796
799
801 TImageCacheReadPolicy *myReadPolicy;
802
804 TImageCacheWritePolicy *myWritePolicy;
805
806 // ------------------------- Internals ------------------------------------
807
808 }; // end of class TiledImage
809
810
817 template <typename TImageContainer, typename TImageFactory, typename TImageCacheReadPolicy, typename TImageCacheWritePolicy>
818 std::ostream&
820
821} // namespace DGtal
822
823
825// Includes inline functions.
826#include "DGtal/images/TiledImage.ih"
827
828// //
830
831#endif // !defined TiledImage_h
832
833#undef TiledImage_RECURSES
834#endif // else defined(TiledImage_RECURSES)
Aim: This class encapsulates its parameter class so that to indicate to the user that the object/poin...
Definition Alias.h:183
Aim: implements an images cache with 'read and write' policies.
Definition ImageCache.h:78
void clearCacheAndResetCacheMisses()
Definition ImageCache.h:235
bool read(const Point &aPoint, Value &aValue) const
bool isValid() const
Definition ImageCache.h:156
unsigned int getCacheMissRead()
Definition ImageCache.h:203
void update(const Domain &aDomain)
bool write(const Point &aPoint, const Value &aValue)
void incCacheMissWrite()
Definition ImageCache.h:227
ImageContainer * getPage(const Domain &aDomain) const
void incCacheMissRead()
Definition ImageCache.h:219
unsigned int getCacheMissWrite()
Definition ImageCache.h:211
Aim: model of CConstBidirectionalRangeFromPoint that adapts a TiledImage range of elements bounded by...
Aim: model of CBidirectionalRangeFromPoint that adapts a TiledImage range of elements bounded by two ...
Domain::Iterator BlockCoordsIterator
Definition TiledImage.h:248
std::bidirectional_iterator_tag iterator_category
Definition TiledImage.h:241
bool operator!=(const TiledIterator &it) const
Definition TiledImage.h:318
bool operator==(const TiledIterator &it) const
Definition TiledImage.h:307
TiledIterator(BlockCoordsIterator aBlockCoordsIterator, const Point &aPoint, const TiledImage< ImageContainer, ImageFactory, ImageCacheReadPolicy, ImageCacheWritePolicy > *aTiledImage)
Definition TiledImage.h:277
ImageContainer * myTile
Alias on the current tile.
Definition TiledImage.h:441
BlockCoordsIterator myBlockCoordsIterator
Current block coords iterator.
Definition TiledImage.h:447
const TiledImage * myTiledImage
TiledImage pointer.
Definition TiledImage.h:438
TiledIterator(BlockCoordsIterator aBlockCoordsIterator, const TiledImage< ImageContainer, ImageFactory, ImageCacheReadPolicy, ImageCacheWritePolicy > *aTiledImage)
Definition TiledImage.h:258
ImageContainer::Range::Iterator TiledRangeIterator
Definition TiledImage.h:247
TiledRangeIterator myTiledRangeIterator
Current tiled range iterator.
Definition TiledImage.h:444
Aim: implements a tiled image from a "bigger/original" one from an ImageFactory.
Definition TiledImage.h:79
ConstIterator begin() const
Definition TiledImage.h:459
OutputIterator begin()
Definition TiledImage.h:464
TiledIterator ConstIterator
Definition TiledImage.h:451
ImageContainer * findTileFromBlockCoords(const Point &aCoord) const
Definition TiledImage.h:685
TImageCacheReadPolicy ImageCacheReadPolicy
Definition TiledImage.h:104
TImageCacheWritePolicy ImageCacheWritePolicy
Definition TiledImage.h:105
bool isValid() const
Definition TiledImage.h:592
TImageCacheReadPolicy * myReadPolicy
TImageCacheReadPolicy pointer.
Definition TiledImage.h:801
ImageContainer::Point Point
Definition TiledImage.h:95
boost::reverse_iterator< TiledIterator > ReverseTiledIterator
Definition TiledImage.h:454
ReverseTiledIterator ReverseOutputIterator
Definition TiledImage.h:456
ReverseTiledIterator ConstReverseIterator
Definition TiledImage.h:455
BOOST_CONCEPT_ASSERT((concepts::CImageCacheReadPolicy< TImageCacheReadPolicy >))
ConstReverseIterator rend() const
Definition TiledImage.h:525
unsigned int getCacheMissRead()
Definition TiledImage.h:761
TiledImage< TImageContainer, TImageFactory, TImageCacheReadPolicy, TImageCacheWritePolicy > Self
Definition TiledImage.h:84
const Domain findSubDomain(const Point &aPoint) const
Definition TiledImage.h:603
ImageFactory * myImageFactory
ImageFactory pointer.
Definition TiledImage.h:792
const Domain domainBlockCoords() const
Definition TiledImage.h:212
ConstReverseIterator rend()
Definition TiledImage.h:530
TiledImageBidirectionalConstRangeFromPoint< TiledImage > ConstRange
Definition TiledImage.h:559
const Domain findSubDomainFromBlockCoords(const Point &aCoord) const
Definition TiledImage.h:659
BOOST_CONCEPT_ASSERT((concepts::CImageFactory< TImageFactory >))
ImageContainer::Difference Difference
Definition TiledImage.h:98
ImageFactory::OutputImage OutputImage
Definition TiledImage.h:102
void selfDisplay(std::ostream &out) const
ReverseOutputIterator routputIterator(const Point &aPoint)
Definition TiledImage.h:552
MyImageCache * myImageCache
ImageCache pointer.
Definition TiledImage.h:795
OutputIterator end()
Definition TiledImage.h:486
ReverseOutputIterator routputIterator()
Definition TiledImage.h:547
Domain::Integer myN
Number of tiles per dimension.
Definition TiledImage.h:786
ImageContainer::Value Value
Definition TiledImage.h:96
TiledImageBidirectionalRangeFromPoint< TiledImage > Range
Definition TiledImage.h:560
const Domain & domain() const
Definition TiledImage.h:202
ConstIterator begin(const Point &aPoint) const
Definition TiledImage.h:469
TiledImage(const TiledImage &other)
Definition TiledImage.h:150
OutputIterator outputIterator()
Definition TiledImage.h:537
OutputIterator outputIterator(const Point &aPoint)
Definition TiledImage.h:542
void setValue(const Point &aPoint, const Value &aValue)
Definition TiledImage.h:744
TImageCacheWritePolicy * myWritePolicy
TImageCacheWritePolicy pointer.
Definition TiledImage.h:804
ConstRange constRange() const
Definition TiledImage.h:566
ReverseOutputIterator rbegin(const Point &aPoint)
Definition TiledImage.h:513
ConstReverseIterator rbegin(const Point &aPoint) const
Definition TiledImage.h:501
ImageCache< OutputImage, ImageFactory, ImageCacheReadPolicy, ImageCacheWritePolicy > MyImageCache
Definition TiledImage.h:106
TiledImage & operator=(const TiledImage &other)
Definition TiledImage.h:171
TImageContainer ImageContainer
Types copied from the container.
Definition TiledImage.h:93
Point mySize
Width of a tile (for each dimension)
Definition TiledImage.h:789
ReverseOutputIterator rbegin()
Definition TiledImage.h:496
TiledIterator OutputIterator
Definition TiledImage.h:452
ConstIterator end() const
Definition TiledImage.h:481
ConstReverseIterator rbegin() const
Definition TiledImage.h:491
Point m_lowerBound
domain lower and upper bound
Definition TiledImage.h:798
TiledImage(Alias< ImageFactory > anImageFactory, Alias< ImageCacheReadPolicy > aReadPolicy, Alias< ImageCacheWritePolicy > aWritePolicy, typename Domain::Integer N)
Definition TiledImage.h:119
void clearCacheAndResetCacheMisses()
Definition TiledImage.h:777
ImageContainer::Domain Domain
Definition TiledImage.h:94
BOOST_CONCEPT_ASSERT((concepts::CImage< TImageContainer >))
Checking concepts.
OutputIterator begin(const Point &aPoint)
Definition TiledImage.h:475
Value operator()(const Point &aPoint) const
Definition TiledImage.h:707
TImageFactory ImageFactory
Types.
Definition TiledImage.h:101
BOOST_CONCEPT_ASSERT((concepts::CImageCacheWritePolicy< TImageCacheWritePolicy >))
unsigned int getCacheMissWrite()
Definition TiledImage.h:769
const Point findBlockCoordsFromPoint(const Point &aPoint) const
Definition TiledImage.h:635
std::ostream & info()
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
DGtal::uint32_t Dimension
Definition Common.h:119
Trace trace
Aim: Defines the concept describing a cache read policy.
Aim: Defines the concept describing a cache write policy.
Aim: Defines the concept describing an image factory.
Aim: Defines the concept describing a read/write image, having an output iterator.
Definition CImage.h:103
const Point aPoint(3, 4)
ImageContainerBySTLVector< HyperRectDomain< Z2i::Space >, std::unordered_set< Z2i::Point > > TImageContainer