Clases
bicotiImageBorderStrategy
bicotiImageBorderStrategy2D
bicotiImageBorderStrategy2DX0
bicotiImageBorderStrategy2DX1
bicotiImageBorderStrategy3D
bicotiImageBorderStrategy3DX0
bicotiImageBorderStrategy3DX1
bicotiImageBorderStrategy3DX2
Templates Clases
PixelType
class bicotiImageBorderStrategy < class PixelType >
virtual
void SetNextCoordinates ( ) = 0
Esta es la única función que necesita tener la estrategia, una vez llamada setea la nueva posición del iterador.
Por ejemplo, si tenemos un iterador 2D :
template<
class PixelType >
class bicotiImageIterator2D
{
friend class bicotiImageBorderStrategy2DX0< PixelType >;
friend class bicotiImageBorderStrategy2DX1< PixelType >;
protected:
int current_x0,current_x1; // variables que indican la
posición.
bicotiImageBorderStrategy2DX0< PixelType > x0_strategy; //
estrategia para x0
bicotiImageBorderStrategy2DX1< PixelType > x1_strategy; //
estrategia para x1
Como se puede ver , en parte del cabezal de la clase, el iterador tiene como miembros a dos estrategias, una para x0 ( horizontal ) y otra para x1 ( vertical ), que a su vez se declaran com clases amigas, de forma que pueden modificar la variables privadas del iterador. Las únicas variables relevantes para las estrategias son current_x0 y current_x1, las que indican la posición actual del iterador sobre la imagen, estas son las que modificarán las estrategias.
En el ejemplo de la figura 3.1.8, hay dos casos en los
que se puede llamar a la función SetNextCoordinates de x0_strategy
por parte del iterador :
cuando x0 = 5 e incrementamos x0
cuando x0 = 0 y decrementamos x0
En otra situación no tiene sentido llamarla.
Figura 3.1.8
En la función X0Increment( ) del iterador, cuando se está en la situación de la figura 3.1.8 (a) se llama a la función SetNextCoordinates( ) de x0_strategy. En la función X0Decrement( ), cuando se está en la situación de la figura 3.1.8 (b) también se llama a la función SetNextCoordinates( ) de x0_strategy.
Algo idéntico pasa para x1_strategy o x2_strategy ( en el caso 3D ).
Respecto al movimiento, la idea más general es
que la variable que se incrementa vuelva al primer lugar mientras que las
demás se incrementen o decrementen dependiendo de un parámetro
propio de la estrategia, un paso.
En el caso 2D, cunado se incrementa x0 , la función
haría :
iterator.current_x0
= 0; // vuelvo x0 al principio
iterator.current_x1
+= step; // x1 se incrementa de acuerdo al paso ( step )
La nueva posición del iterador dependerá del valor de step. En la figura 3.1.9 se muestran algunas posibilidades.
Figura 3.1.9
Observese que con step = 1, nos moveremos hacia la fila
de abajo, haciendo el movimiento que parecería mas razonable, por
lo tanto este será el valor por defecto.
Con step = 2 nos salteamos una fila.
Con step = 0 volvemos a la misma fila.
Con step = -1 nos movemos hacia arriba.
Ver el archivo recorridos.cpp para más ejemplos.