DGtal 1.4.0
Loading...
Searching...
No Matches
FreemanChain.h
1
17#pragma once
18
39#if defined(FreemanChain_RECURSES)
40#error Recursive header files inclusion detected in FreemanChain.h
41#else // defined(FreemanChain_RECURSES)
43#define FreemanChain_RECURSES
44
45#if !defined FreemanChain_h
47#define FreemanChain_h
48
50// Inclusions
51
52#include <iostream>
53#include <sstream>
54#include <vector>
55#include <iterator>
56#include "DGtal/kernel/PointVector.h"
57#include "DGtal/base/OrderedAlphabet.h"
58#include "DGtal/base/Circulator.h"
59#include "DGtal/arithmetic/ModuloComputer.h"
60
61#include "DGtal/base/CConstSinglePassRange.h"
62#include "DGtal/topology/KhalimskySpaceND.h"
63#include "DGtal/base/ConstAlias.h"
64
65
67
68
69namespace DGtal
70{
71
73 // class FreemanChain
75
112 template <typename TInteger>
114 {
115
116 public :
117
119 typedef TInteger Integer;
121
124
125 typedef unsigned int Size;
126 typedef unsigned int Index;
127
128 // ------------------------- iterator ------------------------------
129 public:
130
132 // class FreemanChain::ConstIterator
134
135
142 {
143 public:
144
145 using iterator_category = std::bidirectional_iterator_tag;
147 using difference_type = int;
148 using pointer = Point*;
150
151 // ------------------------- Private data -----------------------
152
153 private:
154
157
160
163
164 // ------------------------- Standard services -----------------------
165 public:
166
172 : myFc( NULL ), myPos( 0 )
173 { }
174
183
184
197 : myFc( &aChain ), myPos( n ), myXY ( XY )
198 { }
199
204 ConstIterator( const ConstIterator & aOther )
205 : myFc( aOther.myFc ), myPos( aOther.myPos ), myXY( aOther.myXY )
206 { }
207
214
219 { }
220
221 // ------------------------- iteration services -------------------------
222 public:
223
224
228 const Point& operator*() const
229 {
230 return myXY;
231 }
232
236 const Point& get() const
237 {
238 return myXY;
239 }
240
246 {
247 this->next();
248 return *this;
249 }
250
256 {
257 ConstIterator tmp(*this);
258 this->next();
259 return tmp;
260 }
261
262
266 void next();
267
272
277 {
278 return myPos;
279 }
280
281
285 const FreemanChain * getChain() const
286 {
287 return myFc;
288 }
289
294 //unsigned int getCode() const
295 char getCode() const
296 {
297 ASSERT( myFc != 0 );
298 return myFc->code( myPos );
299 }
300
301
307 {
308 this->previous();
309 return *this;
310 }
311
317 {
318 ConstIterator tmp(*this);
319 this->previous();
320 return tmp;
321 }
322
323
327 void previous();
328
329
334
335
344 bool operator== ( const ConstIterator & aOther ) const
345 {
346 ASSERT( myFc == aOther.myFc );
347 return myPos == aOther.myPos;
348 }
349
350
359 bool operator!= ( const ConstIterator & aOther ) const
360 {
361 ASSERT( myFc == aOther.myFc );
362 return myPos != aOther.myPos;
363 }
364
374 bool operator< ( const ConstIterator & aOther ) const
375 {
376 ASSERT( myFc == aOther.myFc );
377 return myPos < aOther.myPos;
378 }
379
380 };
381
382
384// class CodesRange
386
394{
395
396 // ------------------------- inner types --------------------------------
397public:
398
399 typedef std::string::const_iterator ConstIterator;
400 typedef std::string::const_reverse_iterator ConstReverseIterator;
402 typedef std::reverse_iterator<ConstCirculator> ConstReverseCirculator;
403
404 // ------------------------- standard services --------------------------------
405
410
414 CodesRange(const std::string& aChain ): myChain(aChain){}
415
420 CodesRange( const CodesRange & aOther )
421 : myChain( aOther.myChain ){}
422
429 {
430 if ( this != &other )
431 {
432 myChain = other.myChain;
433 }
434 return *this;
435 }
436
441
445 std::string::size_type size() const
446 {
447 return myChain.size();
448 }
449
454 bool isValid() const { return true; }
455
456 // ------------------------- display --------------------------------
461 void selfDisplay ( std::ostream & out ) const
462 {
464 out << "[FreemanChainCodes]" << std::endl;
465 out << "\t";
466 std::copy( this->begin(), this->end(), std::ostream_iterator<Value>(out, "") );
467 out << std::endl;
468 }
469
476 friend std::ostream& operator <<(std::ostream & out, const CodesRange & object)
477 {
478 object.selfDisplay( out );
479 return out;
480 }
481 // ------------------------- private data --------------------------------
482 private:
486 std::string myChain;
487 // ------------------------- iterator services --------------------------------
488public:
489
495 return myChain.begin();
496 }
497
503 return myChain.end();
504 }
505
511 return myChain.rbegin();
512 }
513
519 return myChain.rend();
520 }
521
527 return ConstCirculator( this->begin(), this->begin(), this->end() );
528 }
529
534 ConstReverseCirculator rc() const {
535 return ConstReverseCirculator( this->c() );
536 }
537};
538
540// end of class CodesRange
542
547 {
548 return CodesRange(chain);
549 }
550
551
553 // ----------------------- Standard services ------------------------------
554
555 public:
556
561 { }
562
569 FreemanChain( const std::string & s = "", TInteger x = 0, TInteger y = 0 );
570
571
576 FreemanChain( const std::vector<Point>& vectPoints);
577
578
583 FreemanChain(std::istream & in );
584
585
590 FreemanChain( const FreemanChain & other );
591
592
599
600
606 bool operator==( const FreemanChain & other) const
607 {
608 return (chain == other.chain) && ( x0 == other.x0 ) && ( y0 == other.y0 )
609 && ( xn == other.xn ) && ( yn == other.yn );
610 }
611
617 bool operator!=( const FreemanChain & other) const
618 {
619 return !( (*this) == other );
620 }
621
622
629 //unsigned int code( Index pos ) const;
630 char code( Index pos ) const;
631
632
636 Size size() const;
637
638
650
651
661
662
672
673
682 void computeBoundingBox( TInteger & min_x, TInteger& min_y,
683 TInteger& max_x, TInteger& max_y ) const;
684
701 //BK
702 typename Self::ConstIterator
704
724 //BK
725 typename Self::ConstIterator
727
728
735 int isClosed() const ;
736
737
748 int ccwLoops() const ;
749
750
761 Point getPoint ( Index pos ) const;
762
763
768 {
769 return Point(x0,y0);
770 }
771
772
776 Point lastPoint ( ) const
777 {
778 return Point(xn,yn);
779 }
780
781
787 {
788 return lastPoint() - firstPoint();
789 }
790
791
797
803
804
805
806
807
808
809
811 // ----------------------- Iteration services ------------------------------
812
818
819
825
833 Index next( Index pos ) const;
834
835
843 Index previous( Index pos ) const;
844
845
846 // ------------------------- Static services -----------------------
847
848 public:
849
855 static void write( std::ostream & out, const FreemanChain & c )
856 {
857 out << c.x0 << " " << c.y0 << " " << c.chain << std::endl;
858 }
859
860
866 static void read( std::istream & in, FreemanChain & c );
867
875 template<typename TConstIterator>
876 static void readFromPointsRange( const TConstIterator& itBegin, const TConstIterator& itEnd, FreemanChain & c );
877
884 template<typename TRange>
885 static void readFromPointsRange( const TRange& aRange, FreemanChain & c );
886
893 static void getContourPoints(const FreemanChain & fc,
894 std::vector<Point> & aVContour );
895
896
913 const FreemanChain & fc,
914 typename KhalimskySpaceND<2, TInteger>::SCellSet & aSCellContour,
915 bool aFlagForAppend=false);
916
917
918
919
926 //static void movePointFromFC(Point & aPoint, unsigned int aCode );
927 static void movePointFromFC(Point & aPoint, char aCode );
928
929
930 // Deprecated
931 //
932 // /**
933 //  * @param aZero (returns) the '0' or 'x' letter for quadrant [quadrant].
934 //  * @param aOne (returns) the '1' or 'y' letter for quadrant [quadrant].
935 //  * @param aQuadrant the quadrant as any of '0', '1', '2', or '3'.
936 //  */
937 // static void alphabet( char & aZero, char & aOne, char aQuadrant )
938
939
952 //static unsigned int movement( unsigned int aCode1, unsigned int aCode2,
953 // bool ccw = true );
954 static char movement( char aCode1, char aCode2,
955 bool ccw = true );
956
964 static char addToCode( char code, int n);
965
966
976 static short freemanCode4C(int dx, int dy);
977
978
979
987 // static void displacement( int & dx, int & dy, unsigned int aCode );
988 static void displacement( int & dx, int & dy, char aCode );
989
990
991
996 // static Point displacement( unsigned int aCode );
997 static Point displacement( char aCode );
998
999
1009 // static unsigned int turnedCode( unsigned int aCode, bool ccw = true );
1010 static char turnedCode( char aCode, bool ccw = true );
1011
1012
1034 static void pointel2pixel( FreemanChain & aPixChain,
1035 std::vector<unsigned int> & aPl2pix,
1036 std::vector<unsigned int> & aPix2pl,
1037 const FreemanChain & aPlChain )
1038 {
1039 innerContour( aPixChain, aPl2pix, aPix2pl, aPlChain, true );
1040 };
1041
1069 static void innerContour( FreemanChain & aInnerChain,
1070 std::vector<unsigned int> & aOuter2inner,
1071 std::vector<unsigned int> & aInner2outer,
1072 const FreemanChain & aOuterChain,
1073 bool ccw = true );
1074
1075
1098 static bool cleanOuterSpikes( FreemanChain & aCleanC,
1099 std::vector<unsigned int> & aC2clean,
1100 std::vector<unsigned int> & aClean2c,
1101 const FreemanChain & c,
1102 bool ccw = true );
1103
1104
1105
1106
1107 // ----------------------- Interface --------------------------------------
1108
1109 public:
1110
1115 void selfDisplay ( std::ostream & out ) const ;
1116
1117
1122 bool isValid() const ;
1123
1124
1125
1126 // ----------------------- Drawing services --------------------------------
1127
1128 public:
1129
1134 //DrawableWithBoard2D* defaultStyle( std::string mode = "" ) const;
1135
1136
1140 std::string className() const;
1141
1142 // ------------------------- Public Datas ------------------------------
1143
1144 public:
1148 std::string chain;
1149
1154
1159
1164
1169
1170
1171 // ------------------------- Internals ------------------------------------
1172
1173
1174 private:
1175
1180 // FreemanChain() {};
1181
1187
1188 public:
1189
1190
1191 }; // end of class FreemanChain
1192
1193
1194
1195
1202 template<typename TInteger>
1203 std::ostream&
1204 operator<< ( std::ostream & out, const FreemanChain<TInteger> & object );
1205
1206
1207} // namespace DGtal
1208
1209
1211// Includes inline functions/methods.
1212#include "DGtal/geometry/curves/FreemanChain.ih"
1213
1214// //
1216
1217#endif // !defined FreemanChain_h
1218
1219#undef FreemanChain_RECURSES
1220#endif // else defined(FreemanChain_RECURSES)
Aim: Provides an adapter for classical iterators that can iterate through the underlying data structu...
Definition Circulator.h:86
Aim: This class encapsulates its parameter class so that to indicate to the user that the object/poin...
Definition ConstAlias.h:187
Aim: model of CRange that provides services to (circularly)iterate over the letters of the freeman ch...
friend std::ostream & operator<<(std::ostream &out, const CodesRange &object)
ConstIterator end() const
void selfDisplay(std::ostream &out) const
Circulator< ConstIterator > ConstCirculator
CodesRange & operator=(const CodesRange &other)
CodesRange(const CodesRange &aOther)
ConstReverseIterator rend() const
ConstIterator begin() const
ConstCirculator c() const
ConstReverseCirculator rc() const
std::reverse_iterator< ConstCirculator > ConstReverseCirculator
CodesRange(const std::string &aChain)
std::string::const_reverse_iterator ConstReverseIterator
ConstReverseIterator rbegin() const
std::string::size_type size() const
std::string::const_iterator ConstIterator
ConstIterator(const ConstIterator &aOther)
Index myPos
The current position in the word.
const FreemanChain * myFc
The Freeman chain visited by the iterator.
bool operator<(const ConstIterator &aOther) const
const FreemanChain * getChain() const
ConstIterator(ConstAlias< FreemanChain > aChain, Index n=0)
const Point & operator*() const
ConstIterator & operator=(const ConstIterator &other)
ConstIterator(ConstAlias< FreemanChain > aChain, Index n, const Point &XY)
bool operator==(const ConstIterator &aOther) const
Point myXY
The current coordinates of the iterator.
std::bidirectional_iterator_tag iterator_category
bool operator!=(const ConstIterator &aOther) const
void computeBoundingBox(TInteger &min_x, TInteger &min_y, TInteger &max_x, TInteger &max_y) const
FreemanChain(const std::vector< Point > &vectPoints)
PointVector< 2, Integer > Vector
char code(Index pos) const
Size size() const
FreemanChain & operator=(const FreemanChain &other)
int ccwLoops() const
Point lastPoint() const
FreemanChain(const std::string &s="", TInteger x=0, TInteger y=0)
static void write(std::ostream &out, const FreemanChain &c)
ConstIterator end() const
Point firstPoint() const
bool isValid() const
bool operator==(const FreemanChain &other) const
void selfDisplay(std::ostream &out) const
static void displacement(int &dx, int &dy, char aCode)
ConstIterator begin() const
CodesRange getCodesRange()
FreemanChain & operator+=(const FreemanChain &other)
static char turnedCode(char aCode, bool ccw=true)
PointVector< 2, Integer > Point
int isClosed() const
static char addToCode(char code, int n)
FreemanChain< Integer > Self
BOOST_CONCEPT_ASSERT((concepts::CInteger< TInteger >))
Index next(Index pos) const
static Point displacement(char aCode)
Vector totalDisplacement() const
static void innerContour(FreemanChain &aInnerChain, std::vector< unsigned int > &aOuter2inner, std::vector< unsigned int > &aInner2outer, const FreemanChain &aOuterChain, bool ccw=true)
static void getInterPixelLinels(const KhalimskySpaceND< 2, TInteger > &aKSpace, const FreemanChain &fc, typename KhalimskySpaceND< 2, TInteger >::SCellSet &aSCellContour, bool aFlagForAppend=false)
bool operator!=(const FreemanChain &other) const
Self::ConstIterator findQuadrantChange(OrderedAlphabet &A) const
FreemanChain & retract(Size n=1)
static void readFromPointsRange(const TRange &aRange, FreemanChain &c)
FreemanChain operator+(const FreemanChain &other) const
FreemanChain(std::istream &in)
Point getPoint(Index pos) const
FreemanChain(const FreemanChain &other)
static void read(std::istream &in, FreemanChain &c)
static void getContourPoints(const FreemanChain &fc, std::vector< Point > &aVContour)
static void readFromPointsRange(const TConstIterator &itBegin, const TConstIterator &itEnd, FreemanChain &c)
static void pointel2pixel(FreemanChain &aPixChain, std::vector< unsigned int > &aPl2pix, std::vector< unsigned int > &aPix2pl, const FreemanChain &aPlChain)
Self::ConstIterator findQuadrantChange4(OrderedAlphabet &A) const
FreemanChain & extend(char code)
static void movePointFromFC(Point &aPoint, char aCode)
static short freemanCode4C(int dx, int dy)
std::string className() const
Index previous(Index pos) const
FreemanChain subChain(Index pos, Size n) const
static char movement(char aCode1, char aCode2, bool ccw=true)
static bool cleanOuterSpikes(FreemanChain &aCleanC, std::vector< unsigned int > &aC2clean, std::vector< unsigned int > &aClean2c, const FreemanChain &c, bool ccw=true)
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...
std::set< SCell > SCellSet
Preferred type for defining a set of SCell(s).
Aim: Describes an alphabet over an interval of (ascii) letters, where the lexicographic order can be ...
Aim: Implements basic operations that will be used in Point and Vector classes.
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
Aim: Concept checking for Integer Numbers. More precisely, this concept is a refinement of both CEucl...
Definition CInteger.h:88
const Point aPoint(3, 4)