DGtal 1.4.0
Loading...
Searching...
No Matches
ArithmeticalDSS.h
1
17#pragma once
18
31#if defined(ArithmeticalDSS_RECURSES)
32#error Recursive header files inclusion detected in ArithmeticalDSS.h
33#else // defined(ArithmeticalDSS_RECURSES)
35#define ArithmeticalDSS_RECURSES
36
37#if !defined ArithmeticalDSS_h
39#define ArithmeticalDSS_h
40
42// Inclusions
43#include <iostream>
44#include "DGtal/base/Common.h"
45#include "DGtal/base/Exceptions.h"
46
47#include "DGtal/geometry/curves/ArithmeticalDSL.h"
48#include "DGtal/geometry/curves/ArithmeticalDSSCheck.h"
49#include "DGtal/geometry/curves/ArithmeticalDSSFactory.h"
50#include "DGtal/geometry/curves/ArithmeticalDSSConvexHull.h"
51#include "DGtal/arithmetic/SternBrocot.h"
52#include "DGtal/math/linalg/SimpleMatrix.h"
54
55namespace DGtal
56{
57
59 // template class ArithmeticalDSS
92 template <typename TCoordinate,
93 typename TInteger = TCoordinate,
94 unsigned short adjacency = 8>
95 class ArithmeticalDSS
96 {
97 friend class ArithmeticalDSSFactory<TCoordinate, TInteger, adjacency>;
98
99 // ----------------------- static members -----------------------------------
100 public:
104 static const unsigned short foregroundAdjacency = adjacency;
105
106 // ----------------------- Inner types -----------------------------------
107 public:
108
113 typedef TCoordinate Coordinate;
118 typedef TInteger Integer;
120
128 typedef typename DSL::Space Space;
132 typedef typename DSL::Point Point;
136 typedef typename DSL::Vector Vector;
140 typedef typename DSL::Steps Steps;
148 typedef typename DSL::ConstIterator ConstIterator;
153
159
160 // ----------------------- Standard services ------------------------------
161 public:
162
169
190 ArithmeticalDSS(const Coordinate& aA, const Coordinate& aB,
191 const Integer& aLowerBound, const Integer& aUpperBound,
192 const Point& aF, const Point& aL,
193 const Point& aUf, const Point& aUl,
194 const Point& aLf, const Point& aLl,
195 const Steps& aSteps, const Vector& aShift);
196
212 ArithmeticalDSS(const DSL& aDSL,
213 const Point& aF, const Point& aL,
214 const Point& aUf, const Point& aUl,
215 const Point& aLf, const Point& aLl);
216
239 const Point& aF, const Point& aL,
240 const Point& aUf, const Point& aUl,
241 const Point& aLf, const Point& aLl);
242
243
244
245
259 ArithmeticalDSS(const Point& aF, const Point& aL,
260 const bool& areOnTheUpperLine = true);
261
273 ArithmeticalDSS(const DSL& aDSL, const Point& aF, const Point& aL);
274
286 ArithmeticalDSS(const ArithmeticalDSS& aDSS, const Point& aF, const Point& aL);
287
297 template <typename Iterator>
298 ArithmeticalDSS(const Iterator& aItb, const Iterator& aIte);
299
305
312
320
327 bool equalsTo ( const ArithmeticalDSS & aOther ) const;
328
336 bool operator== ( const ArithmeticalDSS & aOther ) const;
337
344 bool operator!= ( const ArithmeticalDSS & aOther ) const;
345
350
351 // ----------------------- Interface --------------------------------------
352 public:
353
358 void selfDisplay ( std::ostream & out ) const;
359
366 bool isValid() const;
367
374 const DSL& dsl() const;
375
379 Coordinate a() const;
380
384 Coordinate b() const;
385
390 Integer mu() const;
391
396 Integer omega() const;
397
401 Vector shift() const;
406 Steps steps() const;
407
412 Point back() const;
413
418 Point front() const;
419
423 Point Uf() const;
424
428 Point Ul() const;
429
433 Point Lf() const;
434
438 Point Ll() const;
439
447
457
466
477 bool before (const Point& aP1, const Point& aP2) const;
478
489 bool beforeOrEqual (const Point& aP1, const Point& aP2) const;
490
497 bool isInDSL(const Point& aPoint) const;
498
504 bool isInDSS(const Point& aPoint) const;
505
506 bool operator()(const Point& aPoint) const;
507
508
515 bool isInDSL(const DSL& aDSL) const;
516
517
529 bool isInDSL(const DSL& aDSL, std::vector<Point> &Ulp, std::vector<Point> &Llp, Point& outP) const;
530
531
532
548
549
550 // ----------------------- Iterator services -------------------------------
556
562
568
574
575 // ----------------------- Dynamic methods --------------------------------
576
599 unsigned short int isExtendableFront( const Point& aNewPoint ) const;
600
623 unsigned short int isExtendableBack( const Point& aNewPoint ) const;
624
637 bool extendFront( const Point& aNewPoint );
650 bool extendBack( const Point& aNewPoint );
651
662
673
674 // ------------------------- Display services ------------------------------
684 PointD project( const Point& aM, double aR ) const;
685
694 PointD project( const Point & aM, const Point & aP ) const;
695
699 std::string className() const;
700
701 // ------------------------- Hidden services ------------------------------
702 protected:
703
729 bool retractUpdateLeaningPoints( const Vector& aDirection,
730 const Point& aFirst,
731 const Point& aLast,
732 const Point& aBezout,
733 const Point& aFirstAtOppositeSide,
734 Point& aLastAtOppositeSide,
735 Point& aFirstAtRemovalSide,
736 const Point& aLastAtRemovalSide);
737
745 void retractUpdateParameters( const Vector& aNewDirection );
746
747
748 // ------------------------- Protected Datas ------------------------------
749 protected:
750
751 // -------------------- first and last point, leaning points ---------------
776
777 //------------------------ DSL ---------------------------------------------
782
783 }; // end of class ArithmeticalDSS
784
785
792 template <typename TCoordinate, typename TInteger, unsigned short adjacency>
793 std::ostream&
794 operator<< ( std::ostream & out, const ArithmeticalDSS<TCoordinate, TInteger, adjacency> & object );
795
796} // namespace DGtal
797
798
800// Aliases
801namespace DGtal
802{
828 template <typename TCoordinate, typename TInteger = TCoordinate>
830 public ArithmeticalDSS<TCoordinate, TInteger, 4>
831 {
832 public:
834 typedef typename Super::Point Point;
836 typedef typename Super::DSL DSL;
837
838 public:
839
857 StandardDSS4(const Coordinate& aA, const Coordinate& aB,
858 const Point& aF, const Point& aL,
859 const Point& aUf, const Point& aUl,
860 const Point& aLf, const Point& aLl);
861
875 StandardDSS4(const Point& aF, const Point& aL,
876 const bool& isOnTheUpperLine = true);
877
888 StandardDSS4(const DSL& aDSL,
889 const Point& aF, const Point& aL);
890
903 const Point& aF, const Point& aL);
904
914 template <typename Iterator>
915 StandardDSS4(const Iterator& aItb, const Iterator& aIte);
916
921 StandardDSS4 ( const StandardDSS4 & aOther );
922
929
930 };
931
967 template <typename TCoordinate, typename TInteger = TCoordinate>
968 class NaiveDSS8:
969 public ArithmeticalDSS<TCoordinate, TInteger, 8>
970 {
971 public:
973 typedef typename Super::Point Point;
975 typedef typename Super::DSL DSL;
976
977 public:
995 NaiveDSS8(const Coordinate& aA, const Coordinate& aB,
996 const Point& aF, const Point& aL,
997 const Point& aUf, const Point& aUl,
998 const Point& aLf, const Point& aLl);
999
1000
1014 NaiveDSS8(const Point& aF, const Point& aL,
1015 const bool& isOnTheUpperLine = true);
1016
1027 NaiveDSS8(const DSL& aDSL,
1028 const Point& aF, const Point& aL);
1029
1041 NaiveDSS8(const NaiveDSS8& aDSS,
1042 const Point& aF, const Point& aL);
1043
1053 template <typename Iterator>
1054 NaiveDSS8(const Iterator& aItb, const Iterator& aIte);
1055
1060 NaiveDSS8 ( const NaiveDSS8 & aOther );
1061
1067 NaiveDSS8 & operator= ( const NaiveDSS8 & aOther );
1068
1069 };
1070} // namespace DGtal
1071
1072
1074// Includes inline functions.
1075#include "DGtal/geometry/curves/ArithmeticalDSS.ih"
1076// //
1078
1080#endif // !defined ArithmeticalDSS_h
1081
1082#undef ArithmeticalDSS_RECURSES
1083#endif // else defined(ArithmeticalDSS_RECURSES)
Aim: This class represents a naive (resp. standard) digital straight line (DSL), ie....
Aim: This class represents a naive (resp. standard) digital straight segment (DSS),...
std::string className() const
ArithmeticalDSS & operator=(const ArithmeticalDSS &aOther)
Integer omega() const
BOOST_CONCEPT_ASSERT((concepts::CInteger< Integer >))
ArithmeticalDSS negate() const
unsigned short int isExtendableBack(const Point &aNewPoint) const
Integer orthogonalPosition(const Point &aPoint) const
bool isInDSL(const DSL &aDSL) const
bool before(const Point &aP1, const Point &aP2) const
ArithmeticalDSS(const Point &aPoint)
static const unsigned short foregroundAdjacency
bool beforeOrEqual(const Point &aP1, const Point &aP2) const
void retractUpdateParameters(const Vector &aNewDirection)
bool isInDSL(const DSL &aDSL, std::vector< Point > &Ulp, std::vector< Point > &Llp, Point &outP) const
ArithmeticalDSS computeUnion(const ArithmeticalDSS &aOther) const
Vector shift() const
bool retractUpdateLeaningPoints(const Vector &aDirection, const Point &aFirst, const Point &aLast, const Point &aBezout, const Point &aFirstAtOppositeSide, Point &aLastAtOppositeSide, Point &aFirstAtRemovalSide, const Point &aLastAtRemovalSide)
BOOST_CONCEPT_ASSERT((concepts::CInteger< Coordinate >))
ArithmeticalDSS(const DSL &aDSL, const Point &aF, const Point &aL)
Coordinate a() const
PointD project(const Point &aM, const Point &aP) const
bool equalsTo(const ArithmeticalDSS &aOther) const
Position position(const Point &aPoint) const
unsigned short int isExtendableFront(const Point &aNewPoint) const
ArithmeticalDSS(const ArithmeticalDSS &aDSS, const Point &aF, const Point &aL)
bool operator()(const Point &aPoint) const
bool operator==(const ArithmeticalDSS &aOther) const
Integer remainder(const Point &aPoint) const
void selfDisplay(std::ostream &out) const
ArithmeticalDSS(const Point &aF, const Point &aL, const bool &areOnTheUpperLine=true)
ArithmeticalDSS(const DSL &aDSL, const Point &aF, const Point &aL, const Point &aUf, const Point &aUl, const Point &aLf, const Point &aLl)
bool extendBack(const Point &aNewPoint)
ConstIterator begin() const
const DSL & dsl() const
ArithmeticalDSS(const Iterator &aItb, const Iterator &aIte)
DSL::ConstIterator ConstIterator
bool operator!=(const ArithmeticalDSS &aOther) const
DSL::ConstReverseIterator ConstReverseIterator
bool isInDSS(const Point &aPoint) const
DGtal::PointVector< 2, double > PointD
Integer mu() const
ArithmeticalDSS(const Coordinate &aA, const Coordinate &aB, const Integer &aLowerBound, const Integer &aUpperBound, const Point &aF, const Point &aL, const Point &aUf, const Point &aUl, const Point &aLf, const Point &aLl, const Steps &aSteps, const Vector &aShift)
ArithmeticalDSS(const ArithmeticalDSS &aOther)
ConstReverseIterator rbegin() const
bool isInDSL(const Point &aPoint) const
ArithmeticalDSL< Coordinate, Integer, adjacency > DSL
bool extendFront(const Point &aNewPoint)
Coordinate b() const
ArithmeticalDSS(const Coordinate &aA, const Coordinate &aB, const Point &aF, const Point &aL, const Point &aUf, const Point &aUl, const Point &aLf, const Point &aLl)
ConstReverseIterator rend() const
PointD project(const Point &aM, double aR) const
ConstIterator end() const
Aim: This class represents a standard digital straight segment (DSS), ie. the sequence of simply 8-co...
NaiveDSS8(const Point &aF, const Point &aL, const bool &isOnTheUpperLine=true)
NaiveDSS8(const Coordinate &aA, const Coordinate &aB, const Point &aF, const Point &aL, const Point &aUf, const Point &aUl, const Point &aLf, const Point &aLl)
NaiveDSS8(const NaiveDSS8 &aDSS, const Point &aF, const Point &aL)
NaiveDSS8(const NaiveDSS8 &aOther)
Super::Coordinate Coordinate
ArithmeticalDSS< TCoordinate, TInteger, 8 > Super
NaiveDSS8 & operator=(const NaiveDSS8 &aOther)
NaiveDSS8(const Iterator &aItb, const Iterator &aIte)
NaiveDSS8(const DSL &aDSL, const Point &aF, const Point &aL)
This class adapts any bidirectional iterator so that operator++ calls operator-- and vice versa.
Aim: This class represents a standard digital straight segment (DSS), ie. the sequence of simply 4-co...
StandardDSS4(const Iterator &aItb, const Iterator &aIte)
StandardDSS4(const Point &aF, const Point &aL, const bool &isOnTheUpperLine=true)
StandardDSS4(const StandardDSS4 &aDSS, const Point &aF, const Point &aL)
Super::Coordinate Coordinate
StandardDSS4(const DSL &aDSL, const Point &aF, const Point &aL)
ArithmeticalDSS< TCoordinate, TInteger, 4 > Super
StandardDSS4(const StandardDSS4 &aOther)
StandardDSS4(const Coordinate &aA, const Coordinate &aB, const Point &aF, const Point &aL, const Point &aUf, const Point &aUl, const Point &aLf, const Point &aLl)
StandardDSS4 & operator=(const StandardDSS4 &aOther)
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)