class bicotiPixelComplex<
class
PixelType,
class PixelPrecisionType =
PixelType>
El argumento
del template PixelType, en ves del habitual "ColorType" de pixel vectorial,
se debe a
que el complejo
que se construye en base a pixels ya existentes. Por ejemplo se puede hacer
un
bicotiPixelComplex<
char
>, o un bicotiPixelComplex< bicotiRGB< int > >, o un
bicotiPixelComplex<
bicotiPixelVectorialDynamic<
float> >, etc.
De la misma
forma el PixelPrecisionType, se utiliza para hacer cuentas con precisión,
solo que
ahora cuando
tengamos: PixelType = char, usar PixelPrecisionType = float,
por ejemplo;
PixelType
= bicotiRGB< int >, usar PixelPrecisionType = bicotiRGB<
double >, por ejemplo;
PixelType
= bicotiPixelVectorialDynamic< float >, podria dejar el default
template; etc.
Se sugiere
por simplicidad, comenzar por estudiar los otros pixels primero.
bicotiPixelComplex
( PixelType, PixelType )
bicotiPixelComplex
( )
~bicotiPixelComplex
( )
bicotiPixelComplex
( const bicotiPixelComplex<PixelType,PixelPrecisionType>
&
)
void
operator = ( const bicotiPixelComplex
<PixelType,PixelPrecisionType> &
)
bool
operator == ( const bicotiPixelComplex<PixelType,PixelPrecisionType>&
)
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
+ ( double )
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
- ( double )
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
* ( double )
bicotiPixelComplex<PixelType,PixelPrecisonType>operator
/ ( double )
void
operator += ( double
)
void
operator -= ( double
)
void
operator *= ( double
)
void
operator /= ( double
)
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
+ ( const PixelType & )
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
- ( const PixelType & )
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
* ( const PixelType & )
bicotiPixelComplex<PixelType,PixelPrecisionType>operator
/ ( const PixelType &
)
void
operator += ( const PixelType
& )
void
operator -= ( const PixelType
& )
void
operator *= ( const PixelType
& )
void
operator /= ( const PixelType
& )
bicotiPixelComplex<PixelType,PixelPrecisionType>
operator + ( const bicotiPixelComplex<PixelTypePixelPrecisionType>
& )
bicotiPixelComplex<PixelType,PixelPrecisionType>
operator - ( const bicotiPixelComplex<PixelType,PixelPrecisionType>
& )
bicotiPixelComplex<PixelType,PixelPrecisionType>
operator * ( const bicotiPixelComplex<PixelType,PixelPrecisionType>
& )
bicotiPixelComplex<PixelType,PixelPrecisionType>
operator / ( const bicotiPixelComplex<PixelType,PixelPrecisionType>
&
)
void
operator += ( const
bicotiPixelComplex<PixelType,PixelPrecisionType> &
)
void
operator -= ( const
bicotiPixelComplex<PixelType,PixelPrecisionType> &
)
void
operator *= ( const
bicotiPixelComplex<PixelType,PixelPrecisionType> &
)
void
operator /= ( const
bicotiPixelComplex<PixelType,PixelPrecisionType> &
)
PixelType& Real ( )
PixelType& Imaginary ( )
bicotiPixelComplex<PixelType,PixelPrecisionType>
Conjugate
( )
PixelType
Module
( )
PixelType
Argument
( )
operator
bicotiPixelComplex<
PixelPrecisionType,
PixelType >( )
Es el constructor
de la clase, se pasa como parámetros los valores de parte real y
parte imaginaria,
en ese orden.
bicotiRGB<unsigned char> pixel_real( 2, 2, 2);
bicotiRGB<unsigned char> pixel_imaginary( 5,
5, 5);
bicotiPixelComplex < bicotiRGB<unsigned char> > my_pixel( pixel_real,pixel_imaginary);
Creo un bicotiPixelComplex
=
Constructor por defecto de la clase.
Es el destructor de la clase.
Constructor de copia.
El operador de asignación , simplemente crea una copia, sin construir
un nuevo objeto.
Es decir que puedo hacer algo como :
bicotiPixelComplex<int> pixel_a( 3,3 );
bicotiPixelComplex<int> pixel_b( 1,1);
pixel_b = pixel_a;
El pixel pixel_b resulta una copia exacta de pixel_a.
pixel_a = 3 + 3 j
pixel_b = 1 + 1 j
Operador de comparación . Devuelve true cuando los pixels poseen
la misma parte real, y la
misma parte imaginaria.
Este operador le suma un doble a la parte real y a la parte imaginaria.
Por ejemplo si fuera pixel_a = 1 + 2 j
y hago :
pixel_b = pixel_a + 3;
Obtengo pixel_b = 4 + 5 j
Este operador le resta un doble a la parte real y al parte imaginaria,
y devuelve un nuevo
pixel. Similar al operator +.
Este operador multiplica por un doble a la parte real y a la parte imaginaria,
y devuelve un nuevo
pixel. Por ejemplo si fuera pixel_a = 1 + 0
j
y hago :
pixel_b = pixel_a * 2;
Obtengo pixel_b = 2 + 0 j
Este operador divide por un doble a la parte real y a la parte imaginaria,
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 la parte real y a la parte imaginaria,
y devuelve los resultados
en el mismo pixel.
Por ejemplo si fuera pixel = 1 - 1 j
y hago :
pixel += 2;
Obtengo pixel = 3 + 1 j
Este operador le resta un doble a la parte real y a la parte imaginaria,
y devuelve los resultados
en el mismo pixel. Similar al operator +=.
Este operador multiplica por un doble a la parte real y a la parte imaginaria,
y devuelve los
resultados en el mismo pixel.
Por ejemplo si fuera pixel = 2 - 1 j
y hago :
pixel *= -1;
Obtengo pixel = -2 + 1 j
Este tipo de operadores tiene una utilidad interesante para setearle fácilmente
valores a todas
las componentes.
Por ejemplo si quiero obtener el pixel "0" ( el complejo 0 + 0 j )
Puedo hacer:
pixel *= 0;
Este operador divide por un doble a la parte real y a la parte imaginaria,
y devuelve los
resultados en el mismo pixel. Similar al operator /=.
Este operador le resta un doble a cada uno de los campos y devuelve un
nuevo pixel. Similar al
operator +.
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 resta un doble a cada uno de los campos y devuelve los
resultados
en el mismo pixel. Similar al operator +=.
Este operador divide por un doble a cada uno de los campos y devuelve los
resultados
en el mismo pixel. Similar al operator /=.
Suma de complejos.
bicotiPixelComplex<unsigned char> pixel_a( 1, 2);
bicotiPixelComplex<unsigned char> pixel_b( 2, 2);
pixel_a = pixel_a + pixel_b;
Se obtiene en pixel_a = 3 + 4 j
Este operador realiza la resta de complejos, entre pixels bicotiPixelComplex,
similar al
operator+.
Este operador realiza el producto de complejos. Por ejemplo:
bicotiPixelComplex<unsigned char> pixel_a( 1, 2);
bicotiPixelComplex<unsigned char> pixel_b( 2, 2);
pixel_a = pixel_a * pixel_b;
Se obtiene en pixel_a = -2 + 6 j;
Este operador realiza la división de complejos. Por ejemplo:
bicotiPixelComplex< float > pixel_a( 1, 2);
bicotiPixelComplex< float > pixel_b( 2, 2);
pixel_a = pixel_a / pixel_b;
Se obtiene en pixelito = .75 + .25 j;
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:
bicotiPixelComplex<unsigned char> pixel_a( 1, 2);
bicotiPixelComplex<unsigned char> pixel_b( 2, 2);
pixel_a = pixel_a + pixel_b;
ó puedo hacer
pixel_a += pixel_b;
Se obtiene en pixelito = 3 + 4 j;
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 en complejos.
Sobrecarga del operador *=, producto de complejos, ejemplo:
bicotiPixelComplex<unsigned char> pixel_a( 1, 2);
bicotiPixelComplex<unsigned char> pixel_b( 2, 2);
pixel_a = pixel_a * pixel_b;
ó puedo hacer
pixel_a *= pixel_b;
Se obtiene en pixel_b = -2 + 6 j;
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= ).
Sobrecarga del operador /=, división de complejos, ejemplo:
bicotiPixelComplex< float > pixel_a( 1, 2);
bicotiPixelComplex< float > pixel_b( 2, 2);
pixel_a = pixel_a / pixel_b;
ó puedo hacer
pixel_a /= pixel_b;
Se obtiene en pixel_a = .75 + .25 j
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= ).
Función de acceso bidireccional a la parte real del complejo, o
sea puedo leer la parte real o
setearla.
Igual que la función Real, pero para acceder a la parte imaginaria de complejo.
Retorna el pixel conjugado, del pixel con el cual se invoca.
Retorna el módulo del pixel en cuestion, observar
que si el pixel es vectorial, lo que se retorna es
el módulo de cada uno de sus campos.
Retorna la fase del complejo en cuestion, observar que si es un pixel vectorial,
lo que se retorna
es la fase de cada uno de sus campos.
Esta función realiza el casting adecuado a un tipo de precisión
deseado por el usuario,
recomendamos por simplicidad, estudiar los otros pixels primero para entender
el concepto.
Pone el pixel 1 en ambos campos del complejo.
Por ejemplo si tengo :
bicotiPixelComplex< float > pixel_a( 1, 2);
pixel_a.Ones();
Obtengo a = 1 + j
Si tengo :
bicotiPixelComplex< bicotiRGB< float > > pixel_b(
1, 2);
pixel_b.Ones();
Obtengo a = ( 1, 1 , 1 ) + j ( 1 , 1 , 1)