Clases
bicotiImageIterator
bicotiImageIterator2D
bicotiImageIterator2DArray
bicotiImageIterator2DSparse
bicotiImageIterator3D
bicotiImageIterator3DArray
bicotiImageIterator3DLinear
Templates Clases
PixelType
class bicotiImageIterator < class PixelType >
PixelType & operator * ( )
virtual void operator ++ ( int ) =
0
virtual void operator -- ( int ) =
0
virtual void operator += ( unsigned )
= 0
virtual void operator -= ( unsigned )
= 0
virtual void First ( ) = 0
virtual void Last ( ) = 0
boolIsDone
( )
PixelType
* GetCurrentPixel ( )
virtual void SetCurrentPixel ( PixelType
) = 0
virtual bicotiCoordinate< INTEGER > GetCurrentCoordinateInteger
( ) = 0
virtual bicotiCoordinate< REAL > GetCurrentCoordinateReal
( ) = 0
Operador
para "desreferenciar al iterador". Si vemos al iterador como un puntero
a un pixel de la imagen, * iterador me da ese pixel.
Por ejemplo en la imagen 2D de la figura.
Si hacemos :
PixelType pix;
pix = * iterator;
obtenemos pix = 2
Por lo general trabajamos con un puntero a un iterador, por lo tanto lo más usual de ver es :
pix = ** ptr_iterator;
Donde ptr_iterator es un puntero a un iterador, entonces *ptr_iterator es un iterador.
Este operador es bidireccional, con lo que podemos utilizarlo
también para escribir sobre el punto donde estoy parado.
Por ejemplo si en la figura 3.1.10 quiero cambiar el
2 al que apunto por un 5, hago :
* iterator = 5 ;
Este operador mueve al iterador un lugar. Hacia donde es el movimiento depende de la estrategia de borde elegida, pero el comportamiento por defecto y el que será usado en la gran mayoría de los casos es el que se indica en la figura 3.1.11.
Figura 3.1.11
En general si tenemos una imagen ND, con :
x_0_sise = dim_x_0 -- columnas
x_1_sise = dim_x_1 -- filas
x_2_sise = dim_x_2 -- profundidad
...
x_N-1_sise = dim_x_N-1
Incrementando primero X0 hasta que X0 = dim_x_0 -1 , luego
incremento X1 y pongo X0 = 0 , cuando llego a X1 = x_1_dim-1 incremento
X2 y así susecivamente. Es decir se hace un recorrido por
filas incrementando la profundidad cuando se llega al último elemneto
del plano.
En el ejemplo de la figura, estoy parado en ( 3 , 1 )
, pix = 2, si hacemos :
iterator ++ ;
pix = * iterator; // obtengo pix = 1
iterator ++ ;
pix = * iterator; // obtengo pix = 9
Si tenemos un puntero a iterador hay que hacer :
( * ptr_iterator ) ++ ;
pix = ** ptr_iterator; // obtengo pix = 1
Cuando se ha llegado al final, ( X0 = x_0_dim -1 , X1 = x_1_dim - 1, X2 = x_2_dim - 1 , ... ) este operador ya no moverá al iterador.
En el ejemplo de la figura 3.1.11, si estoy en el último lugar ( 4 , 3 ) y hago:
pix = * iterator; // obtengo pix = 2
iterator ++ ;
pix = * iterator; // vuelvo a obtener pix =
2
Esta función es virtual pura en esta clase.
Este
operador mueve al iterador un lugar pero en sentido contrario al ++ , también
depende de la estrategia de borde elegida, pero lo más usual ( el
comportamiento por defecto ) es el que se muestra en
la figura.
Figura 3.1.12
Decrementando primero X0 hasta que X0 = 0 , luego decremento
X1 y pongo X0 = x_0_dim - 1 , cuando llego a X1 = 0 decremento X2
y así susecivamente.
En el ejemplo de la figura, estoy parado en ( 1 , 1 )
, pix = 4, si hacemos :
iterator -- ;
pix = * iterator; // obtengo pix = 1
iterator -- ;
pix = * iterator; // obtengo pix = 4
Si tenemos un puntero a iterador hay que hacer :
( * ptr_iterator ) -- ;
pix = ** ptr_iterator; // obtengo pix = 1
Cuando se ha llegado al principio, ( X0 = 0 , X1 = 0, X2 = 0 , ... ) este operador ya no moverá al iterador.
En el ejemplo de la figura 3.1.12, si estoy en el primer lugar ( 0 , 0 ) y hago:
pix = * iterator; // obtengo pix = 0
iterator -- ;
pix = * iterator; // vuelvo a obtener pix =
0
Esta función es virtual pura en esta clase.
Este
operador mueve al iterador más de un lugar hacia la derecha.
Por ejemplo,
hacer :
iterador += 2;
es quivalente
a :
iterator ++;
iterator ++;
El sentido del movimiento depende de la estrategia de borde elegida.
Esta función es virtual pura en esta clase.
Este
operador mueve al iterador más de un lugar hacia la izquierda.
Por ejemplo,
hacer :
iterador -= 2;
es quivalente
a :
iterator --;
iterator --;
El sentido del movimiento depende de la estrategia de borde elegida.
Esta función es virtual pura en esta clase.
Pone el iterador en el primer lugar de
la imagen , que en gnereral es el de coordenadas ( 0, 0, ..., 0 )
pero pueden setearse algunos parámetros del iterador para que comienze
en otro punto.
En el jemplo de la figura 3.1.13, estoy en el punto de coordenadas ( 5
, 1 ).
Si hago :
pix = * iterator; // obtengo pix = 1
iterator.First( );
pix = * iterator; // obtengo pix = 2
Esta función es virtual pura en esta clase.
Pone el iterador en el último lugar
de la imagen , que en gnereral es el de coordenadas
( dim_x_0 - 1, dim_x_1 - 1 , ..., dim_x_N - 1 ) pero pueden setearse algunos
parámetros
del iterador para que termine en otro punto.
En el jemplo de la figura 3.1.14, estoy en el punto de coordenadas ( 5
, 1 ).
Figura 3.1.14
Si hago :
pix = * iterator; // obtengo pix = 1
iterator.Last( );
pix = * iterator; // obtengo pix = 2
Esta función es virtual pura en esta clase.
Esta función booleana indica si
se llegó al final de la imagen, esto depende de dos cosas , del
punto
donde esté parado y hacia donde me intente mover.
Por ejemplo si estoy parado en el penúltimo punto de la imagen de
la figura 3.1.14
y hago :
pix = * iterator ; // obtengo pix = 7
fin = iterator.IsDone ( ) // obtengo fin = false;
iterator ++;
pix = * iterator ; // obtengo pix = 2
fin = iterator.IsDone ( ) // obtengo fin = false;
iterator ++;
pix = * iterator ; // obtengo pix = 2 , no se mueve
fin = iterator.IsDone ( ) // obtengo fin = true;
Análogamente si estoy parado en el segundo punto de la imagen de
la figura 3.1.14
y hago :
pix = * iterator ; // obtengo pix = 0
fin = iterator.IsDone ( ) // obtengo fin = false;
iterator --;
pix = * iterator ; // obtengo pix = 2
fin = iterator.IsDone ( ) // obtengo fin = false;
iterator --;
pix = * iterator ; // obtengo pix = 2 , no se mueve
fin = iterator.IsDone ( ) // obtengo fin = true;
Es similar
al operador * , con la única salvedad que aquí se retorna
una referencia ( un puntero ) al
pixel donde estoy parado.
Por ejemplo en la figura
3.1.10 estoy parado en ( 4 , 1 ), si hago :
pix = * ( * iterator ) ; // obtengo pix = 2
Si tengo un puntero a iterador , tengo que hacer :
pix = * ( ** ptr_iterator ) ;
Sirve
para escribir sobre el punto actual.
Por ejemplo
si en la situación de la figura 3.1.10 hacemos :
iterator.SetCurrentPixel( 10 );
Pongo un 10
en lugar del 2.
Esto es lo
mismo que hacer :
* iterator = 10 ;
Devuelve una
coordenada de enteros que indica el punto donde estamos actualmente parados.
Por ejemplo si estamos
en la situación de la figura 3.1.10 . Parados en el punto de coordenadas
( 4 , 1 ) de una imagen
2D.
Si Hacemos :
bicotiCoordinate< INTEGER > coord( 2 ) ; // defino una
coordenada 2D
coord = iterator.GetCurrentCoordinateInteger( );
fila = coord(1); //
obtengo fila = 1
columna = coord(0); // obtengo columna = 4
Ver bicotiCoordinate
para más detalles sobre las coordenadas.
Esta función es virtual pura
en esta clase.
Devuelve una
coordenada de reales que indica el punto donde estamos actualmente parados.
Por ejemplo si estamos
en la situación de la figura 3.1.10 . Parados en el punto de coordenadas
( 4 , 1 ) de una imagen
2D.
Si Hacemos :
bicotiCoordinate< REAL > coord( 2 ) ; // defino una
coordenada 2D
coord = iterator.GetCurrentCoordinateInteger( );
fila = coord(1); //
obtengo fila = 1
columna = coord(0); // obtengo columna = 4
Ver bicotiCoordinate
para más detalles sobre las coordenadas.
Esta función es virtual pura
en esta clase.