bicotiImageBorderStrategy

     Clases

bicotiImageBorderStrategy
        bicotiImageBorderStrategy2D
                    bicotiImageBorderStrategy2DX0
                    bicotiImageBorderStrategy2DX1
        bicotiImageBorderStrategy3D
                    bicotiImageBorderStrategy3DX0
                    bicotiImageBorderStrategy3DX1
                    bicotiImageBorderStrategy3DX2

     Templates Clases

PixelType


class bicotiImageBorderStrategy < class PixelType >



 Public Methods

virtual void SetNextCoordinates ( ) = 0



void SetNextCoordinates ( )

       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.