class bicotiPixelVectorialStatic<
class ColorType,
                                                        
unsigned colors_number =
0 ,
                                                        
class PrecisionType = ColorType>
bicotiPixelVectorialStatic(
)
~bicotiPixelVectorialStatic
( )
bicotiPixelVectorialStatic
(  const  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
>( )
Es el constructor de la clase.
bicotiPixelVectorialStatic < unsigned char, 3 > my_pixel;
Crea una pixel bicotiPixelVectorialStatic de char sin signo.
Es el destructor de la clase.
Constructor de copia.
         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.
           
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".
           
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;
           
Operador de comparación . Devuelve true cuando los valores en los
campos de los pixels son
           
iguales uno a uno.
           
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 )
           
Este operador le resta un doble a cada uno de los campos y devuelve un
nuevo pixel. Similar al
           
operator +.
           
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 )
           
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.
           
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 )
           
Este operador le resta un doble a cada uno de los campos y devuelve los
resultados
           
en el mismo pixel. Similar al operator +=.
           
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;
           
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.
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);
          
Este operador realiza la resta campo a campo entre pixels bicotiPixelVectorialStatic,
similar al
          
operator+.
             
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);
           
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.
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= ).
Similar a el operator +=, solo que en ves de sumar se realiza la resta.
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= ).
           
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.
           
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 :