Moka libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
image-3d.icc
Go to the documentation of this file.
1 /*
2  * lib-extraction-images : Extraction de cartes à partir d'images 2D et 3D.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-extraction-images
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 #include <cstdlib>
26 #include <iostream>
27 
28 namespace GMap3d
29 {
30 //******************************************************************************
31 INLINE
32 CImage3d::CImage3d(int AActuPlaneIndex) :
33  FWidth(0),
34  FHeight(0),
35  FIsOk(true),
36  FNbPlaneToRead(0),
37  FActuPlaneIndex(AActuPlaneIndex),
38  FNullActuPlane(true),
39  FNullPrevPlane(true)
40 {}
41 //******************************************************************************
42 INLINE
43 bool CImage3d::isOk() const
44 {
45  return FIsOk;
46 }
47 //******************************************************************************
48 INLINE
49 unsigned int CImage3d::getPlaneActu() const
50 {
51  return FActuPlaneIndex - 1;
52 }
53 //******************************************************************************
54 INLINE
55 unsigned int CImage3d::getWidth() const
56 {
57  return FWidth;
58 }
59 //******************************************************************************
60 INLINE
61 unsigned int CImage3d::getHeight() const
62 {
63  return FHeight;
64 }
65 //******************************************************************************
66 /* Pour toutes ces methodes : Le premier mot designe le voxel que l'on regarde
67  * (par rapport au voxel actu qui est en bas FMap->alpha droite et devant).
68  * Le second mot désigne le voxel relatif FMap->alpha ce voxel, donc juste up,
69  * behind ou left. x et y sont les coordonnées de actu (dans le plan courant en
70  * z)
71  */
72 //******************************************************************************
73 INLINE
74 bool CImage3d::sameVoxelActuLeft( unsigned int x, unsigned int y ) const
75 {
76  if (FNullActuPlane || y==getHeight()) return true;
77  if (x==0 || x==getWidth()) return false;
78 
79  return sameVoxel(x,y,true, x-1,y,true);
80 }
81 //******************************************************************************
82 INLINE
83 bool CImage3d::sameVoxelActuBehind( unsigned int x, unsigned int y ) const
84 {
85  if (FNullActuPlane || x==getWidth()) return true;
86  if (y==0 || y==getHeight()) return false;
87 
88  return sameVoxel(x,y,true, x,y-1,true);
89 }
90 //******************************************************************************
91 INLINE
92 bool CImage3d::sameVoxelActuUp( unsigned int x, unsigned int y ) const
93 {
94  if (FNullActuPlane) // On traite la derniere plaque de l'image
95  return FNullPrevPlane || x==getWidth() || y==getHeight();
96 
97  if (x==getWidth() || y==getHeight()) return true;
98  if (FNullPrevPlane) return false;
99 
100  return sameVoxel(x,y,true, x,y,false);
101 }
102 //******************************************************************************
103 INLINE
104 bool CImage3d::sameVoxelLeftBehind( unsigned int x, unsigned int y ) const
105 {
106  if (FNullActuPlane || x==0) return true;
107  if (y==0 || y==getHeight()) return false;
108 
109  return sameVoxel(x-1,y,true, x-1,y-1,true);
110 }
111 //******************************************************************************
112 INLINE
113 bool CImage3d::sameVoxelLeftUp( unsigned int x, unsigned int y ) const
114 {
115  if (FNullActuPlane) // On traite la derniere plaque de l'image
116  return FNullPrevPlane || x==0 || y==getHeight();
117 
118  if (x==0 || y==getHeight()) return true;
119  if (FNullPrevPlane) return false; // Si on est sur la derniere plaque
120 
121  // sinon on est au "milieu":
122  return sameVoxel(x-1,y,true, x-1,y,false);
123 }
124 //******************************************************************************
125 INLINE
126 bool CImage3d::sameVoxelBehindLeft( unsigned int x, unsigned int y ) const
127 {
128  if (FNullActuPlane || y==0) return true;
129  if (x==0 || x==getWidth()) return false;
130 
131  return sameVoxel(x,y-1,true, x-1,y-1,true);
132 }
133 //******************************************************************************
134 INLINE
135 bool CImage3d::sameVoxelBehindUp( unsigned int x, unsigned int y ) const
136 {
137  if (FNullActuPlane) // On traite la derniere plaque de l'image
138  return FNullPrevPlane || x==getWidth() || y==0;
139 
140  if (x==getWidth() || y==0) return true;
141  if (FNullPrevPlane) return false; // Si on est sur la derniere plaque
142 
143  // sinon on est au "milieu":
144  return sameVoxel(x,y-1,true, x,y-1,false);
145 }
146 //******************************************************************************
147 INLINE
148 bool CImage3d::sameVoxelUpLeft( unsigned int x, unsigned int y ) const
149 {
150  if (FNullPrevPlane || y==getHeight()) return true;
151  if (x==0 || x==getWidth()) return false;
152 
153  return sameVoxel(x,y,false, x-1,y,false);
154 }
155 //******************************************************************************
156 INLINE
157 bool CImage3d::sameVoxelUpBehind( unsigned int x, unsigned int y ) const
158 {
159  if (FNullPrevPlane || x==getWidth()) return true;
160  if (y==0 || y==getHeight()) return false;
161 
162  return sameVoxel(x,y,false, x,y-1,false);
163 }
164 //******************************************************************************
165 INLINE
166 bool CImage3d::sameVoxelUpbehindLeft( unsigned int x, unsigned int y ) const
167 {
168  if ( y==0 || FNullPrevPlane ) return true;
169  if ( x==0 || x==getWidth() ) return false;
170 
171  return sameVoxel(x,y-1,false, x-1,y-1,false);
172 }
173 //******************************************************************************
174 INLINE
175 bool CImage3d::sameVoxelLeftbehindUp( unsigned int x, unsigned int y ) const
176 {
177  if ( x==0 || y==0 ) return true;
178  if ( FNullActuPlane || FNullPrevPlane ) return false;
179 
180  return sameVoxel(x-1,y-1,true, x-1,y-1,false);
181 }
182 //******************************************************************************
183 INLINE
184 bool CImage3d::sameVoxelLeftupBehind( unsigned int x, unsigned int y ) const
185 {
186  if ( x==0 || FNullPrevPlane ) return true;
187  if ( y==0 || y==getHeight() ) return false;
188 
189  return sameVoxel(x-1,y,false, x-1,y-1,false);
190 }
191 //******************************************************************************
192 INLINE
194 {
195  pushPlane();
196 
197  if (FNbPlaneToRead==0)
198  return false;
199 
200  if (FNbPlaneToRead==1)
201  {
202  ++FActuPlaneIndex;
203  --FNbPlaneToRead;
204  return true;
205  }
206 
207  if (readData())
208  {
209  ++FActuPlaneIndex;
210  FNullActuPlane = false;
211 
212  if (FNbPlaneToRead != -1)
213  --FNbPlaneToRead;
214  }
215  else
216  {
217  ++FActuPlaneIndex;
218  // Pour que le prochain appel à readNextPlane retourne false :
219  // Par contre cet appel retourne true car il y a un plan supplémentaire
220  // après la dernière plaque.
221  FNbPlaneToRead = 0;
222  }
223 
224  return true;
225 }
226 //******************************************************************************
227 INLINE
229 { return FNbPlaneToRead==0; }
230 //******************************************************************************
231 INLINE
232 void CImage3d::freePlane(bool AActuPlane)
233 {
234  if (AActuPlane)
235  FNullActuPlane = true;
236  else
237  FNullPrevPlane = true;
238 }
239 //******************************************************************************
240 INLINE
242 {
243  freePlane(false);
244 
245  FNullPrevPlane = FNullActuPlane;
246  FNullActuPlane = true;
247 }
248 //******************************************************************************
249 } // namespace GMap3d