DGtal  1.5.beta
DGtal::RBC_vec< TSpace, TInputValue, TOutputValue > Struct Template Reference

RBC : Bijective Rotation through Circles. More...

#include <DGtal/images/bijectiveRotations/RBC_vec.h>

Inheritance diagram for DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >:
[legend]

Public Types

typedef std::vector< TOutputValue > Circle
 

Public Member Functions

 RBC_vec (int max_radius, bool smart=false)
 
void init (int R, bool smart)
 
double angle () const
 
double & setAngle ()
 
TOutputValue center () const
 
TOutputValue & center ()
 
TOutputValue rotate (TInputValue p) const
 
TOutputValue operator() (const TInputValue &aInput) const
 
std::size_t size () const
 
const Circlecircle (int r) const
 

Static Public Member Functions

static Circle computeCircle (int r)
 

Data Fields

std::vector< Circlecircles
 
std::map< TOutputValue, TOutputValue > point2circle
 

Protected Attributes

double my_angle
 The angle of rotation. More...
 
TOutputValue my_center
 The center of rotation. More...
 

Detailed Description

template<typename TSpace, typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
struct DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >

RBC : Bijective Rotation through Circles.

Description of template struct RBC_vec

Template Parameters
TSpacea 2 dimensional space.
TInputValuetype of the input point e.g., TSpace::RealPoint.
TOutputValuetype of the output point e.g., TSpace::Point

Definition at line 56 of file RBC_vec.h.

Member Typedef Documentation

◆ Circle

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
typedef std::vector< TOutputValue > DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::Circle

Definition at line 57 of file RBC_vec.h.

Constructor & Destructor Documentation

◆ RBC_vec()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::RBC_vec ( int  max_radius,
bool  smart = false 
)
inline

Constructor

Parameters
max_radiusthe maximal distance of a point to the center of rotation.
smartwhen 'true', tries to regularize the number of points of each circle, when 'false' each circle contains the point between distance r (included) and r+1 (excluded).

Definition at line 72 of file RBC_vec.h.

72  {
73  init( max_radius, smart );
74  my_angle = 0.0;
75  my_center = TOutputValue( 0, 0 );
76  }
double my_angle
The angle of rotation.
Definition: RBC_vec.h:218
void init(int R, bool smart)
Definition: RBC_vec.h:85
TOutputValue my_center
The center of rotation.
Definition: RBC_vec.h:220

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::init(), DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_angle, and DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_center.

Member Function Documentation

◆ angle()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
double DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::angle ( ) const
inline
Returns
the angle of rotation.

Definition at line 138 of file RBC_vec.h.

138  {
139  return my_angle;
140  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_angle.

◆ center() [1/2]

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
TOutputValue& DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::center ( )
inline
Returns
a reference to the centre of rotation

Definition at line 150 of file RBC_vec.h.

150  {
151  return my_center;
152  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_center.

◆ center() [2/2]

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
TOutputValue DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::center ( ) const
inline
Returns
the centre of rotation

Definition at line 146 of file RBC_vec.h.

146  {
147  return my_center;
148  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_center.

Referenced by main().

◆ circle()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
const Circle& DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circle ( int  r) const
inline
Parameters
ran integer smaller than nbCircles().
Returns
the number of circles

Definition at line 183 of file RBC_vec.h.

183  {
184  return circles[ r ];
185  }
std::vector< Circle > circles
Definition: RBC_vec.h:61

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circles.

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::computeCircle(), and DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::rotate().

◆ computeCircle()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
static Circle DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::computeCircle ( int  r)
inlinestatic
Parameters
ran integer specifying the digital radius of the circle.
Returns
the points lying in the circle between radius r (included) and r+1 (excluded)

Definition at line 190 of file RBC_vec.h.

190  {
191  int d2_lo = r*r;
192  int d2_up = (r+1)*(r+1);
193  TOutputValue start( r, 0 );
194  Circle circle;
195  TOutputValue current = start;
196  do {
197  circle.push_back( current );
198  auto V = nextNeighbors<TOutputValue>( current );
199  std::vector<TOutputValue> P;
200  for ( auto p : V ) {
201  int d2 = p.squaredNorm();
202  // std::cout << "p=" << p << " d2=" << d2 << std::endl;
203  if ( d2_lo <= d2 && d2 < d2_up ) P.push_back( p );
204  }
205  if ( P.empty() ) std::cerr << "Error ! " << std::endl;
206  TOutputValue b = P[ 0 ];
207  for ( int i = 1; i < P.size(); i++ )
208  if ( less<TOutputValue>( P[ i ], b ) ) b = P[ i ];
209  current = b;
210  } while ( current != start );
211  return circle;
212  }
const Circle & circle(int r) const
Definition: RBC_vec.h:183
std::vector< TOutputValue > Circle
Definition: RBC_vec.h:57

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circle().

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::init().

◆ init()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
void DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::init ( int  R,
bool  smart 
)
inline

Initialization

Parameters
Rthe maximal distance of a point to the center of rotation.
smartwhen 'true', tries to regularize the number of points of each circle, when 'false' each circle contains the point between distance r (included) and r+1 (excluded).

Definition at line 85 of file RBC_vec.h.

85  {
86  TOutputValue c( 0, 0 );
87  circles.clear();
88  circles.resize( R + 1 );
89  circles[ 0 ].push_back( c );
90  point2circle[ c ] = TOutputValue( 0, 0 );
91  std::size_t N = 1;
92  std::vector< TOutputValue > points;
93  for ( int r = 1; r <= R; r++ )
94  {
95  circles[ r ] = computeCircle( r );
96  for ( int i = 0; i < circles[ r ].size(); i++, N++ )
97  {
98  point2circle[ circles[ r ][ i ] ] = TOutputValue( r, i );
99  points.push_back( circles[ r ][ i ] );
100  }
101  }
102  if ( ! smart ) return;
103  struct DistanceComparator {
104  bool operator()( TOutputValue p, TOutputValue q ) const
105  {
106  return p.squaredNorm() < q.squaredNorm();
107  }
108  };
109  struct AngleComparator {
110  bool operator()( TOutputValue p, TOutputValue q ) const
111  {
112  double ap = atan2( p[ 1 ], p[ 0 ] );
113  double aq = atan2( q[ 1 ], q[ 0 ] );
114  return ap < aq;
115  }
116  };
117 
118  // Try to improve circles.
119  // target number of points for circle r is
120  // n(r) = a * r, with a = 2( N - 1 ) / (R(R+1))
121  double a = 2.0 * double( N - 1 ) / double(R*(R+1));
122  DistanceComparator dcomp;
123  AngleComparator acomp;
124  std::sort( points.begin(), points.end(), dcomp );
125  int current = 1;
126  for ( int r = 1; r <= R; r++ )
127  {
128  int n = int( round( a * r / 8.0 ) * 8.0 );
129  circles[ r ].resize( n );
130  for ( int i = 0; i < n; i++ )
131  circles[ r ][ i ] = points[ current++ ];
132  std::sort( circles[ r ].begin(), circles[ r ].end(), acomp );
133  // std::cout << "r=" << r << " #C=" << circles[ r ].size() << std::endl;
134  }
135  }
TOutputValue operator()(const TInputValue &aInput) const
Definition: RBC_vec.h:171
static Circle computeCircle(int r)
Definition: RBC_vec.h:190
std::map< TOutputValue, TOutputValue > point2circle
Definition: RBC_vec.h:64

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circles, DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::computeCircle(), DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::operator()(), and DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::point2circle.

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::RBC_vec().

◆ operator()()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
TOutputValue DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::operator() ( const TInputValue &  aInput) const
inline

Definition at line 171 of file RBC_vec.h.

172  {
173  return this->rotate(aInput);
174  }
TOutputValue rotate(TInputValue p) const
Definition: RBC_vec.h:157

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::rotate().

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::init().

◆ rotate()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
TOutputValue DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::rotate ( TInputValue  p) const
inline
Parameters
pa lattice point
Returns
the rotation of the point p according to the current angle and center.

Definition at line 157 of file RBC_vec.h.

157  {
158  auto cp = static_cast<TOutputValue>((p - my_center));
159  const auto it = point2circle.find( cp );
160  if ( it == point2circle.end() ) return static_cast<TOutputValue>(p);
161  TOutputValue polar = it->second;
162  int r = polar[ 0 ];
163  int idx = polar[ 1 ];
164  const Circle& C = circle( r );
165  const int N = C.size();
166  int shift = int( round( -my_angle * N / ( 2.0 * M_PI ) ) );
167  int jdx = ( N + idx - shift ) % N;
168  return my_center + C[ jdx ];
169  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circle(), DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_angle, DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_center, and DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::point2circle.

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::operator()().

◆ setAngle()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
double& DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::setAngle ( )
inline
Returns
a reference to the angle of rotation.

Definition at line 142 of file RBC_vec.h.

142  {
143  return my_angle;
144  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_angle.

Referenced by main().

◆ size()

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
std::size_t DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::size ( ) const
inline
Returns
the number of circles

Definition at line 177 of file RBC_vec.h.

177  {
178  return circles.size();
179  }

References DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circles.

Field Documentation

◆ circles

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
std::vector< Circle > DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::circles

◆ my_angle

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
double DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_angle
protected

◆ my_center

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
TOutputValue DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::my_center
protected

◆ point2circle

template<typename TSpace , typename TInputValue = typename TSpace::RealPoint, typename TOutputValue = typename TSpace::Point>
std::map< TOutputValue, TOutputValue > DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::point2circle

the map associating to a lattice point its polar coordinates (r,idx) in the circles.

Definition at line 64 of file RBC_vec.h.

Referenced by DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::init(), and DGtal::RBC_vec< TSpace, TInputValue, TOutputValue >::rotate().


The documentation for this struct was generated from the following file: