vgl_window_scan_iterator.h
Go to the documentation of this file.
1 // This is core/vgl/vgl_window_scan_iterator.h
2 #ifndef vgl_window_scan_iterator_h_
3 #define vgl_window_scan_iterator_h_
4 //:
5 // \file
6 // \brief Iterator to scan rectangular windows
7 // \author fsm
8 // \verbatim
9 // Modifications
10 // Nov.2003 - Peter Vanroose - made class vgl_window_scan_iterator templated
11 // Nov.2003 - Peter Vanroose - made constructor more robust w.r.t. its input
12 // \endverbatim
13 
14 #include <cmath>
15 #ifdef _MSC_VER
16 # include <vcl_msvc_warnings.h>
17 #endif
19 
20 //: Iterator to scan rectangular windows
21 // This class is completely inlined.
22 template <class T>
24 {
25  int x1, y1, x2, y2;
26  public:
27 
28  //: Define rectangular region to be [x1, x2] x [y1, y2]
29  inline void set_window_corners(T x1_, T y1_, T x2_, T y2_)
30  {
31  // Make sure that the scan lines have positive x increment:
32  if (x1_ > x2_) { T x=x1_; x1_=x2_; x2_=x; }
33  x1 = (int) std::ceil (x1_);
34  x2 = (int) std::floor(x2_);
35  // subsequent scan lines need not have positive y increment:
36  if (y1_ <= y2_) {
37  y1 = (int) std::ceil (y1_);
38  y2 = (int) std::floor(y2_);
39  }
40  else {
41  y2 = (int) std::ceil (y2_);
42  y1 = (int) std::floor(y1_);
43  }
44  }
45 
46  //: Define rectangular region to be [x-w, x+w] x [y-h, y+h]
47  inline void set_window(T x, T y, T w, T h)
48  { set_window_corners(x - w, y - h, x + w, y + h); }
49 
50  //: Define rectangular region to be [x-r, x+r] x [y-r, y+r]
51  inline void set_window(T x, T y, T r)
52  { set_window_corners(x - r, y - r, x + r, y + r); }
53 
54  //: makes uninitialized iterator.
55  inline vgl_window_scan_iterator() = default;
56 
57  //: region is [x1, x2] x [y1, y2]. No assumption about x1<x2 or y1<y2.
58  inline vgl_window_scan_iterator(T x1_, T y1_, T x2_, T y2_)
59  { set_window_corners(x1_, y1_, x2_, y2_); }
60 
61  int current_y;
62 
63  inline void reset() override { current_y = y1<=y2 ? y1-1 : y1+1; }
64  inline bool next () override { return y1<=y2 ? ++current_y <= y2 : --current_y >= y2; }
65  inline int scany () const override { return current_y; }
66  inline int startx() const override { return x1; }
67  inline int endx () const override { return x2; }
68 };
69 
70 #define VGL_WINDOW_SCAN_ITERATOR_INSTANTIATE(T) extern "please include <vgl/vgl_window_scan_iterator.hxx> instead"
71 
72 #endif // vgl_window_scan_iterator_h_
Iterator to scan rectangular windows.
Definition: vgl_fwd.h:35
bool next() override
Tries to move to the next scan line.
void reset() override
Resets the scan iterator to before the first scan line.
vgl_window_scan_iterator()=default
makes uninitialized iterator.
int startx() const override
Returns starting x-value of the current scan line.
void set_window(T x, T y, T r)
Define rectangular region to be [x-r, x+r] x [y-r, y+r].
vgl_window_scan_iterator(T x1_, T y1_, T x2_, T y2_)
region is [x1, x2] x [y1, y2]. No assumption about x1<x2 or y1<y2.
void set_window_corners(T x1_, T y1_, T x2_, T y2_)
Define rectangular region to be [x1, x2] x [y1, y2].
int scany() const override
y-coordinate of the current scan line.
Abstract base class for iterating over the pixels in a region of an image.
void set_window(T x, T y, T w, T h)
Define rectangular region to be [x-w, x+w] x [y-h, y+h].
int endx() const override
Returns ending x-value of the current scan line.