bicotiPixelVectorialStatic


bicotiRGB
bicotiPixelVectorialStatic
bicotiPixelVectorialDynamic
bicotiPixelComplex


class bicotiPixelVectorialStatic< class ColorType,
                                                         unsigned colors_number = 0 ,
                                                         class PrecisionType = ColorType>



Public Methods

bicotiPixelVectorialStatic( )
~bicotiPixelVectorialStatic ( )
bicotiPixelVectorialStaticconst  bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> &  )

ColorType operator( ) int  )
unsigned GetColorsNumber ( )

void  operator =const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> &  )
bool  operator ==const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>&  )

bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator + double  )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator -double  )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator *double  )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisonType>operator /double  )

void operator +=double  )
void operator -=double  )
void operator *=double  )
void operator /=double  )

bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
                            operator + ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
                             operator - ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
                            operator * ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
                             operator / ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

void operator += ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
void operator -= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
void operator *= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )
void operator /= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

operator bicotiPixelVectorialStatic< PrecisionType,colors_number,ColorType >( )



bicotiPixelVectorialStatic ( )

        Es el constructor de la clase.

                bicotiPixelVectorialStatic < unsigned char, 3 > my_pixel;

        Crea una pixel bicotiPixelVectorialStatic de char sin signo.



~bicotiPixelVectorialStatic ( )

        Es el destructor de la clase.



bicotiPixelVectorialStatic
                              ( const  bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> )

        Constructor de copia.



ColorType & operator ( ) (  int  index )

         Este operador es la intefaz standard para acceder a las campos de los pixels.
         Todas los pixels vectorial deben tener este operador definido.
         Es bidireccional, por lo que podemos a través de el , leer o setear la componente de índice
         indicado por la variable index.
         Por ejemplo :

                    componete = my_pixel ( 2 )

         Me devuelve la tercer componente del pixel.

                    my_pixel ( 0 ) = 4

         Pone 4 en la primer componente de my_pixel.

         Es importante destacar que los índices van de 0 a colors_number - 1.
         La operación controla que el índice este dentro de rango si se han habilitado los chequeos, ver
         "Macros de Chequeo" para más información.



unsigned GetColorsNumber ( )

            Esta función devuelve la cantidad de "colores" del pixel. También
            es parte de la interfáz standard por lo tanto todos los pixels vectorial deben definirla.
            Para pixels bicotiPixelVectorialStatic retorna el argumento del template, colors_number.
            Esto de gran utilidad para algoritmos que trabajan con pixels vectoriales, sin importar la cantidad
            de "colores".



void  operator =
               (  const bicotiPixelVectorialStatic <ColorType,colors_number,PrecisionType>& )

            El operador de asignación , simplemente crea una copia, sin construir un nuevo objeto.
            Es decir que puedo hacer algo como :

                        bicotiPixelVectorialStatic<int, 3> pixel_a;
                              pixel_a( 0 ) = 3;
                        pixel_a( 1 ) = 3;
                        pixel_a( 2 ) = 3;

                        bicotiPixelVectorialStatic<int, 3> pixel_b;
                              pixel_b( 0 ) = 1;
                        pixel_b( 1 ) = 1;
                        pixel_b( 1 ) = 1;

                        pixel_b = pixel_a;

             El pixel pixel_b resulta una copia exacta de pixel_a.

             Es importante aclarar que este operador solo funciona entre pixels del mismo tipo.
            NO PUEDO HACER :

                        bicotiPixelVectorialStatic<int,2> pixel_a;
                        bicotiPixelVectorialStatic<int,3> pixel_b;

                        pixel_b = pixel_a;



bool  operator ==
                              (  const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

            Operador de comparación . Devuelve true cuando los valores en los campos de los pixels son
            iguales uno a uno.



  bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator + (  double  )

            Este operador le suma un doble a cada uno de los campos y devuelve un nuevopixel.
            Por ejemplo si fuera  pixel_a = ( 1,  3 , -2 )
            y hago :

                        pixel_b = pixel_a + 3;

            Obtengo  pixel_b = ( 4 , 6 , 1 )



bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator - (  double  )

            Este operador le resta un doble a cada uno de los campos y devuelve un nuevo pixel. Similar al
            operator +.



bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator * (  double  )

            Este operador multiplica por un doble a cada uno de los campos y devuelve un nuevo
            pixel.
            Por ejemplo si fuera  pixel_a = ( 1,  0 , -1 )
            y hago :

                        pixel_b = pixel_a * 2;

            Obtengo  pixel_b = ( 2 , 0 , -2 )



  bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>operator / (  double  )

            Este operador divide por un doble a cada uno de los campos y devuelve un nuevo pixel.
            Similar al operator *.
           NO se controla de división por 0 ( cero ). Las consecuencias de hacerlo dependerán de lo que
            haga el sistema operativos para los tipos básicos. Es aconsejable que el usuario contemple
            externamente esta posibilidad.



void operator += (  double  )

            Este operador le suma un doble a cada uno de los campos y devuelve los resultados
            en el mismo pixel.
            Por ejemplo si fuera  pixel = ( 1,  -1, 1 )
            y hago :

                        pixel += 2;

            Obtengo  pixel = ( 3 , 1, 3 )



void operator -= (  double )

            Este operador le resta un doble a cada uno de los campos y devuelve los resultados
            en el mismo pixel. Similar al operator +=.



void operator *= (  double  )

            Este operador multiplica por un doble a cada uno de los campos y devuelve los resultados
            en el mismo pixel.
            Por ejemplo si fuera  pixel = ( 2,  -1,  0 )
            y hago :

                        pixel *= -1;

            Obtengo  pixel = ( -2 , 1 , 0 )

            Este tipo de operadores tiene una utilidad interesante para setearle facilmente valores a todas
            las componentes.
            Por ejemplo si quiero obtener el pixel "0" ( ceros en todos los campos )
            Puedo hacer:

                       pixel *= 0;

            Independientemente de la cantidad de "colores" y del contenido previo de pixel.
            Si quiero poner unos en todos los campos puedo hacer:

                       pixel *= 0;
                       pixel += 1;



void operator /= (  double  )

            Este operador divide por un doble a cada uno de los campos y devuelve los resultados
            en el mismo pixel. Similar al operator *=.
           NO se controla de división por 0 ( cero ). Las consecuencias de hacerlo dependerán de lo que
            haga el sistema operativos para los tipos básicos. Es aconsejable que el usuario contemple
            externamente esta posibilidad.



bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
                   operator +( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> )

            Suma campo a campo de pixels. Por ejemplo :

                               bicotiPixelVectorialStatic<unsigned char,3> pixel_a;
                                       pixel_a( 0 ) = 1,
                                pixel_a( 1 ) = 2;
                                pixel_a( 2 ) = 3;

                                bicotiPixelVectorialStatic<unsigned char,3> pixel_b;
                                        pixel_b( 0 ) = 2;
                                pixel_b( 1 ) = 2;
                                pixel_b( 2 ) = 2;

                                pixel_a = pixel_a + pixel_b;

            Se obtiene en pixel_a = ( 3, 4, 5);



bicotiPixelVectorialStatic<ColorType,colors_numbers,PrecisionType>
               operator -( const bicotiPixelVectorialStatic<ColorType,colors_numbers,PrecisionType> & )

           Este operador realiza la resta campo a campo entre pixels bicotiPixelVectorialStatic, similar al
           operator+.



bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
               operator * ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

              Este operador realiza el producto campo a campo entre pixels bicotiPixelVectorialStatic.
            Por ejemplo:

                               bicotiPixelVectorialStatic<unsigned char,3> pixel_a;
                                pixel_a( 0 ) = 1,
                                pixel_a( 1 ) = 2;
                                pixel_a( 2 ) = 3;

                                bicotiPixelVectorialStatic<unsigned char,3> pixel_b;
                                pixel_b( 0 ) = 2,
                                pixel_b( 1 ) = 2;
                                pixel_b( 2 ) = 2;

                                pixel_a = pixel_a * pixel_b;

            Se obtiene en pixel_a = ( 2, 4, 6);



bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType>
               operator / ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

            Este operador realiza la división campo a campo entre pixels bicotiPixelVectorialStatic, similar al
            operator*.
           NO se controla de división por 0 ( cero ). Las consecuencias de hacerlo dependerán de lo que
            haga el sistema operativos para los tipos básicos. Es aconsejable que el usuario contemple
            externamente esta posibilidad.



  void
            operator += ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

            Sobrecarga del operador +=, ejemplo:

                                bicotiPixelVectorialStatic<unsigned char,3> pixel_a;
                                pixel_a( 0 ) = 1,
                                pixel_a( 1 ) = 2;
                                pixel_a( 2 ) = 3;

                                bicotiPixelVectorialStatic<unsigned char,3> pixel_b;
                                pixel_b( 0 ) = 2,
                                pixel_b( 1 ) = 2;
                                pixel_b( 2 ) = 2;

                                pixel_a = pixel_a + pixel_b;

                                             ó puedo hacer

                               pixel_a += pixel_b;

            Se obtiene en pixel_a = ( 3, 4, 5);

            Este operador normalmente ayuda en claridad en el código y el loops importantes para hacer una
            suma, se llama a una función ( operator+= ) y no a dos ( operator+ y operator= ).



  void
            operator -= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

             Similar a el operator +=, solo que en ves de sumar se realiza la resta.



  void
            operator *= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

            Sobrecarga del operador *=, ejemplo:

                                       bicotiPixelVectorialStatic<unsigned char,3> pixel_a;
                                pixel_a( 0 ) = 1,
                                pixel_a( 1 ) = 2;
                                pixel_a( 2 ) = 3;

                                bicotiPixelVectorialStatic<unsigned char,3> pixel_b;
                                pixel_b( 0 ) = 2,
                                pixel_b( 1 ) = 2;
                                pixel_b( 2 ) = 2;

                                pixel_a = pixel_a * pixel_b;

                                             ó puedo hacer

                               pixel_a *= pixel_b;

            Se obtiene en pixel_a = ( 2, 4, 6);

            Este operador normalmente ayuda en claridad en el código y el loops importantes para hacer una
            suma, se llama a una función ( operator*= ) y no a dos ( operator* y operator= ).



  void
           operator /= ( const bicotiPixelVectorialStatic<ColorType,colors_number,PrecisionType> & )

            Similar a el operator +=, solo que en ves de sumar se realiza la división.
            NO se controla de división por 0 ( cero ). Las consecuencias de hacerlo dependerán de lo que
            haga el sistema operativos para los tipos básicos. Es aconsejable que el usuario contemple
            externamente esta posibilidad.



operator bicotiPixelVectorialStatic<PrecisionType,colors_number,ColorType > ( )

            Operador de casting a un tipo de mejor precision. Creemos que se entendera mejor su utilidad
            con un ejemplo:

            Supongamos que queremos hacer un promedio de 3 pixels
            bicotiPixelVectorialStatic<unsigned char,3> ( notar que con el default template, el
            PrecisionType = unsigned char).

                                    bicotiPixelVectorialStatic<unsigned char,3> pixel_1;
                                              pixel_1( 0 ) = 120;
                                     pixel_1( 1 ) = 25;
                                     pixel_1( 2 ) = 231;

                                     bicotiPixelVectorialStatic<unsigned char,3> pixel_2;
                                              pixel_2( 0 ) = 20;
                                      pixel_2( 1 ) = 200;
                                      pixel_2( 2 ) = 213;

                                     bicotiPixelVectorialStatic<unsigned char,3> pixel_3;
                                              pixel_3( 0 ) = 145;
                                     pixel_3( 1 ) = 12;
                                     pixel_3( 2 ) = 198;

                                    bicotiPixelVectorialStatic<unsigned char,3> suma;
                                             suma *=  0;

             Uno se vería tentado a hacer:

                                    suma += pixel_1;
                                    suma += pixel_2;
                                    suma += pixel_3;

                                    suma /=3;

            Para su asombro obtendría que suma = ( 9, 79, 43).
            El problema esta en que las operaciones cn unsigned char son en módulo 256.
            Para hacer el promedio, sin estos problemas y sin que tener que siempre usar tipos mas costosos
            en términos de espacio de memoria, se usa el casting.

                                    bicotiPixelVectorialStatic<unsigned char,3,float> pixel_1;
                                              pixel_1( 0 ) = 120;
                                     pixel_1( 1 ) = 25;
                                     pixel_1( 2 ) = 231;

                                     bicotiPixelVectorialStatic<unsigned char,3,float> pixel_2;
                                             pixel_2( 0 ) = 20;
                                     pixel_2( 1 ) = 200;
                                     pixel_2( 2 ) = 213;

                                     bicotiPixelVectorialStatic<unsigned char,3,float> pixel_3;
                                              pixel_3( 0 ) = 145;
                                     pixel_3( 1 ) = 12;
                                     pixel_3( 1 ) = 198;

                                    bicotiPixelVectorialStatic<float,3,unsigned char> suma;
                                             suma *=  0;

                                   bicotiPixelVectorialStatic< unsigned char,3,float> promedio;

                                     suma += (bicotiPixelVectorialStatic<float,3, unsigned char>)pixel_1;
                                      suma += (bicotiPixelVectorialStatic<float,3, unsigned char>)pixel_2;
                                      suma += (bicotiPixelVectorialStatic<float,3, unsigned char>)pixel_3;

                                      suma /=3;
                                               promedio = (bicotiPixelVectorialStatic<unsigned char,3, float>)suma;

               Obtenemos promedio = ( 95, 79, 214).

             Los castings se pueden evitar en este caso ya que los Compiladores habitualmente, si no
             encuentran un "macheo" exacto de argumetos para una función, promueven mediante el
             casting y  llaman a la función. Por claridad aqui los hicimos aparecer
             implícitamente, aunque existe otra razón para haberlo hecho. Esta es, que para tipos nativos del
             lenguaje, los castings automáticos a tipos "mas amplios" estan bien definidos, pero a tipos "mas
             chicos" produce perdida de información y un Warning del Compilador. Si se pretende entender
             bien este problema dirigirse a :