INFO804 Introduction à l'informatique graphique
Loading...
Searching...
No Matches
Image2D.h
1// file Image2D.hpp
2#ifndef _IMAGE2D_HPP_
3#define _IMAGE2D_HPP_
4#include <vector>
5
6namespace rt {
7
8/// Classe générique pour représenter des images 2D.
9template <typename TValue>
10class Image2D {
11public:
12 typedef Image2D<TValue> Self; // le type de *this
13 typedef TValue Value; // le type pour la valeur des pixels
14 typedef std::vector<Value> Container; // le type pour stocker les valeurs des pixels de l'image.
15 typedef typename Container::iterator ContainerIterator;
16 typedef typename Container::const_iterator ContainerConstIterator;
17 /// Un itérateur (non-constant) simple sur l'image.
18 struct Iterator : public ContainerIterator {
19 Iterator( const ContainerIterator & other )
20 : ContainerIterator( other )
21 {}
22 Iterator( Self & image, int x, int y )
23 : ContainerIterator( image.m_data.begin() + image.index( x, y ) )
24 {}
25 Iterator& operator=( const ContainerIterator & other )
26 {
27 ContainerIterator::operator=( other );
28 return *this;
29 }
30
31 // operator ContainerIterator() const
32 // {
33 // return static_cast<ContainerIterator>(*this);
34 // }
35
36 };
37
38 struct ConstIterator : public ContainerConstIterator {
39 ConstIterator( const ContainerConstIterator & other )
40 : ContainerConstIterator( other )
41 {}
42 ConstIterator( const Self & image, int x, int y )
43 : ContainerConstIterator( image.m_data.begin() + image.index( x, y ) )
44 {}
45 ConstIterator& operator=( const ContainerConstIterator & other )
46 {
47 ContainerConstIterator::operator=( other );
48 return *this;
49 }
50
51 // operator ContainerConstIterator() const
52 // {
53 // return static_cast<ContainerConstIterator>(*this);
54 // }
55
56 };
57
58 template <typename TAccessor>
59 struct GenericConstIterator : public Container::const_iterator {
60 typedef TAccessor Accessor;
61 typedef typename Accessor::Argument ImageValue; // Color ou unsigned char
62 typedef typename Accessor::Value Value; // unsigned char (pour ColorGreenAccessor)
63 typedef typename Accessor::Reference Reference; // ColorGreenReference (pour ColorGreenAccessor)
64
65 GenericConstIterator( const Image2D<ImageValue>& image, int x, int y )
66 : Container::const_iterator( image.m_data.begin() + image.index( x, y ) ) {}
67
68 // Accès en lecture (rvalue)
69 Value operator*() const
70 { return Accessor::access( Container::const_iterator::operator*() ); }
71
72 };
73
74 template <typename TAccessor>
75 struct GenericIterator : public Container::iterator {
76 typedef TAccessor Accessor;
77 typedef typename Accessor::Argument ImageValue; // Color ou unsigned char
78 typedef typename Accessor::Value Value; // unsigned char (pour ColorGreenAccessor)
79 typedef typename Accessor::Reference Reference; // ColorGreenReference (pour ColorGreenAccessor)
80
81 GenericIterator( Image2D<ImageValue>& image, int x, int y )
82 : Container::iterator( image.m_data.begin() + image.index( x, y ) ) {}
83
84 // Accès en lecture (rvalue)
85 Value operator*() const
86 { return Accessor::access( Container::iterator::operator*() ); }
87
88 // Accès en lecture (rvalue)
89 Reference operator*()
90 { return Accessor::access( Container::iterator::operator*() ); }
91
92 };
93
94 // Constructeur par défaut
95 Image2D();
96 // Constructeur avec taille w x h. Remplit tout avec la valeur g
97 // (par défaut celle donnée par le constructeur par défaut).
98 Image2D( int w, int h, Value g = Value() );
99
100 // Remplit l'image avec la valeur \a g.
101 void fill( Value g );
102
103 /// @return la largeur de l'image.
104 int w() const;
105 /// @return la hauteur de l'image.
106 int h() const;
107
108 /// @return un itérateur pointant sur le début de l'image
109 Iterator begin() { return start( 0, 0 ); }
110 /// @return un itérateur pointant après la fin de l'image
111 Iterator end() { return start( 0, h() ); }
112 /// @return un itérateur pointant sur le pixel (x,y).
113 Iterator start( int x, int y ) { return Iterator( *this, x, y ); }
114
115 template <typename Accessor>
116 GenericConstIterator< Accessor > start( int x = 0, int y = 0 ) const
117 { return GenericConstIterator< Accessor >( *this, x, y ); }
118
119 template <typename Accessor>
120 GenericConstIterator< Accessor > begin() const
121 { return start< Accessor >( 0, 0 ); }
122
123 template <typename Accessor>
124 GenericConstIterator< Accessor > end() const
125 { return start< Accessor >( 0, h() ); }
126
127 template <typename Accessor>
128 GenericIterator< Accessor > start( int x = 0, int y = 0 )
129 { return GenericIterator< Accessor >( *this, x, y ); }
130
131 template <typename Accessor>
132 GenericIterator< Accessor > begin()
133 { return start< Accessor >( 0, 0 ); }
134
135 template <typename Accessor>
136 GenericIterator< Accessor > end()
137 { return start< Accessor >( 0, h() ); }
138
139 /// Accesseur read-only à la valeur d'un pixel.
140 /// @return la valeur du pixel(i,j)
141 Value at( int i, int j ) const;
142
143 /// Accesseur read-write à la valeur d'un pixel.
144 /// @return une référence à la valeur du pixel(i,j)
145 Value& at( int i, int j );
146
147private:
148 Container m_data; // mes données; évitera de faire les allocations dynamiques
149 int m_width; // ma largeur
150 int m_height; // ma hauteur
151
152 /// @return l'index du pixel (x,y) dans le tableau \red m_data.
153 int index( int i, int j ) const;
154};
155
156template <typename TValue>
157Image2D<TValue>::Image2D()
158 : m_data(), m_width( 0 ), m_height( 0 )
159{}
160
161template <typename TValue>
162Image2D<TValue>::Image2D( int w, int h, Value g )
163 : m_data( w*h, g ), m_width( w ), m_height( h )
164{}
165
166template <typename TValue>
167void
168Image2D<TValue>::fill( Value g )
169{
170 m_data.fill( g );
171}
172
173template <typename TValue>
174int
176{ return m_width; }
177
178template <typename TValue>
179int
181{ return m_height; }
182
183template <typename TValue>
185Image2D<TValue>::at( int i, int j ) const
186{
187 return m_data[ index( i, j ) ];
188}
189
190template <typename TValue>
193{
194 return m_data[ index( i, j ) ];
195}
196
197template <typename TValue>
198int
199Image2D<TValue>::index( int i, int j ) const
200{
201 return i + j *w();
202}
203
204} // namespace rt
205#endif // _IMAGE2D_HPP_
Classe générique pour représenter des images 2D.
Definition Image2D.h:10
Iterator end()
Definition Image2D.h:111
Value at(int i, int j) const
Definition Image2D.h:185
int h() const
Definition Image2D.h:180
int w() const
Definition Image2D.h:175
Iterator start(int x, int y)
Definition Image2D.h:113
Iterator begin()
Definition Image2D.h:109
Namespace RayTracer.
Definition Color.h:11
Un itérateur (non-constant) simple sur l'image.
Definition Image2D.h:18