bicotiDexelCurve

 bicotiDexel
             bicotiDexelRegion
             bicotiDexelLabeling
             bicotiDexelHistogram
             bicotiDexelStatistical
             bicotiDexelCurve
                         bicotiDexelCurveOpen
                         bicotiDexelCurveClosed
 

Figura 2.2.2
     Clases

bicotiDexel
bicotiDexelCurve
bicotiDexelCurveOpen
bicotiDexelCurveClosed

     Templates Clases

CoordType
PixelType


class bicotiDexelCurve < class CoordType , class PixelType >



 Public Methods

void SetImageImplementation ( bicotiImageImplamentation< PixelType > * )
void UpdateImageImplementation ( )
void UpdateDexel ( )
void UndoUpdateImageImplementation ( )

CoordType operator ( ) ( double )
CoordType GetCoordinate ( double )
CoordType GetDerivate ( double )
CoordType GetDerivate2 ( double )
CoordType GetDerivate3 ( double )

PixelType GetPixel ( double )
vector< CoordType >& ListCoordinates ( )
void SetPixel ( double, PixelType )

double GetLength ( )

unsigned GetPointsNumber ( )
CoordType GetPoint ( unsigned )
double GetOffset ( unsigned )

void ModifyPixels ( bicotiPixelOperatorUnary< PixelType > *  )



void SetImageImplementation ( bicotiImageImplamentation< PixelType > * )

        Esta es una función común a todos los Dexels. Se declara virtual en bicotiDexel y se implementa en las clases derivadas. Ver SetImageImplementation en bicotiDexel.

        Esta función permite asignar la referencia a una imagen luego de construido el dexel. Tiene sentido para algunos dexels que se pueden construir sin referencia y luego asignarla.



void UpdateImageImplementation ( )

        Esta es una función común a todos los Dexels. Se declara virtual en bicotiDexel y se implementa en las clases derivadas. Ver UpdateImageImplementation en bicotiDexel.

        Es posible modificar arbitrariamente todos los puntos de la imagen que están sobre la curva. Pero el cambio solo se verá en la imagen si llamo a esta función.

                curva.UpdateImageImplementation( );



void UpdateDexel ( )

        Esta es una función común a todos los Dexels. Se declara virtual en bicotiDexel y se implementa en las clases derivadas.Ver UpdateDexel en bicotiDexel.

        Si se hace un cambio en la imagen, el dexel no se modificará automáticamente, debo llamar a esta función para que el dexel se reconstruya. También tiene utilidad para la curva, cuando hago cambios en la lista de puntos.



void UndoUpdateImageImplementation ( )

        Cuando hago cambios en los pixeles de la imagen que corresponden a la curva, esta guarda internamente los valores que sobreescribe. Por lo tanto puedo restaurar la imagen con esta función.
Es decir, si hago :

        curva.ModifyPixels( ptr_operator_unary );  // modifico los pixeles sobre la curva.
        curva.UpdateImageImplementation( ); // reflejo los cambios en la imagen.

        curva.UndoUpdateImageImplementation( ); // la imagen vuelve a ser como al principio.

Esta función esencialmente se pensó para cuando se quiere dar la impresión de movimiento de una curva sobre la imagen, en este caso se debe dibujar la curva y luego borrarla para dibujar la otra.



CoordType operator ( ) ( double offset )

        Devuelve la coordenada de la curva correspondiente al offset indicado.

        Para una curva abierta :
                 offset = 0   da el primer punto.
                 offset = 1   da el último punto.
        Para una curva cerrada :
                 offset = 0   da el primer punto.
                 offset = 1   da el primer punto.

        Los valores entre 0 y 1 que no sean puntos del vector inicial dependerán del interpolador.
        El offset es la longitud de arco normalizada.

        Por ejemplo si para una curva 2D, tomo el vector inicial :
              vector = [ ( 0,0 ) , ( 10,0 ) , ( 10,5 ) , ( 0,10 ) , ( 3,5 ) ]
        y un interpolador "lineal cerrado", tendré la curva cerrada que se muestra en la figura 2.2.2.4.

   Figura 2.2.2.4

        El largo de cada tramo es :
                             1-2 -- 10
                             2-3 -- 5
                             3-4 -- 11.2
                             4-5 -- 5.8
                             5-1 -- 5.8
        El largo total es : 37.8

        Por lo tanto el offset de cada punto será :
                             1 -- 0 y 1 porque es cerrada.
                             2 -- 10 / 37.8 = 0.265
                             3 -- 15 / 37.8 = 0.397
                             4 -- 26.2 / 37.8 = 0.693
                             5 -- 32 / 37.8 = 0.847

        Si la curva es abierta o cambio el interpolador , los offsets cambian.

        Si es este ejemplo hago :

                coord = curva( 0 );

        obtengo coord = ( 0 , 0 )

                coord = curva( 0.1 );

        obtengo coord = ( 3.8 , 0 )

                coord = curva( 0.265 );

        obtengo coord = ( 10 , 0 )

                coord = curva( 0.3 );

        obtengo coord = ( 10 , 1.3 )
 

        Ver Interpoladores de Coordenadas para más detalles.
          Ver ejemplos para más casos.

        La interfáz de este operador se hereda de bicotiFunction. Ver bicotiFunction

        Obs :  El offset debe estar entre 0 y 1, si no es así la función tira una esepción.



CoordType GetCoordinate ( double offset )

        Hace lo mismo que operator ( )



CoordType GetDerivate ( double offset )

        Devuelve la derivada de la curva respecto al offset en el punto cuyo offset corresponde al indicado.
En el caso de la figura 2.2.2.4 la interpolación es lineal, entonces la derivada dará cero en todos los puntos.
Se puede observar que dependiendo de la interpolación que se use, en los nodos la curva puede no ser diferenciable. Por lo general en esos puntos se da la derivada por izquierda.

Ver Interpoladores de Coordenadas para más detalles.
Ver ejemplos para más casos.

Obs : La derivada respecto al offset no es lo mismo que la derivada respecto a la longitud de arco.



CoordType GetDerivate2 ( double )

        Devuelve la derivada segunda de la curva respecto al offset en el punto cuyo offset corresponde al indicado.
Se puede observar que dependiendo de la interpolación que se use, en los nodos la curva puede no ser diferenciable. Por lo general en esos puntos se da la derivada por izquierda.

Ver Interpoladores de Coordenadas para más detalles.
Ver ejemplos .

Obs : La derivada respecto al offset no es lo mismo que la derivada respecto a la longitud de arco.



CoordType GetDerivate3 ( double )

        Devuelve la derivada tercera de la curva respecto al offset en el punto cuyo offset corresponde al indicado.
Se puede observar que dependiendo de la interpolación que se use, en los nodos la curva puede no ser diferenciable. Por lo general en esos puntos se da la derivada por izquierda.

Ver Interpoladores de Coordenadas para más detalles.
Ver ejemplos .

Obs : La derivada respecto al offset no es lo mismo que la derivada respecto a la longitud de arco.



PixelType GetPixel ( double offset )

         Devuelve el valor del pixel ubicado en la imagen en el punto correspondiente al offset dado.
          Es decir que hacer :

                   pixel = curva.GetPixel( offset );

          Es lo mismo que hacer :

                  coord = curva( offset );
                  pixel = image_pixel_interpolator( coord );

         Le pido la coordenada a la curva y luego el pixel correspondiente al interpolador de la imagen.
           No puedo pedirle el pixel directamente a la imagen porque la coordenada es real.

Ver Interpoladores de Coordenadas para más detalles.
Ver ejemplos .



vector< CoordType >& ListCoordinates ( )

        Esta función sirve para leer o setear el vector de coordenadas asociado a la curva.
La clase vector se define en la STL, ver la documentación de dicha librería para más detalles.

En el ejemplo de la figura 2.2.2.4. tenía el vector :

              vector = [ ( 0,0 ) , ( 10,0 ) , ( 10,5 ) , ( 0,10 ) , ( 3,5 ) ]

Para saber la componente x_0 del segundo punto puedo hacer:

         x_0 = curva.ListCoordinates( ).[1].X0( );

Puedo usar esta variable para cambiar algunos puntos de la curva, por ejemplo:

         curva.ListCoordinates( ).[1].X0( ) = 15;
         curva.ListCoordinates( ).[1].X1( ) = 3;

Cambio el vector por :

              vector = [ ( 0,0 ) , ( 15,3) , ( 10,5 ) , ( 0,10 ) , ( 3,5 ) ]

Para que los cambios sean efectivos hay que hacer :

        curva.UpdateDexel( );



void SetPixel ( double offset , PixelType pixel )

        Escribe sobre la imagen cuyas coordenadas son las mismas que las de la curva con el offset indicado por la variable offset, el pixel que le paso. Si la coordenada no es entera se redondea.



double GetLength ( )

        Devuelve la longitud de la curva. Esto se define como la longitud de arco por la escala de la imagen.
Por ejemplo en el caso de la figura 2.2.2.4. La longitud de arco es 37.8, si la escala es 1 esta función dará este valor.



unsigned GetPointsNumber ( )

        Devuelve el número de puntos que tiene la lista de coordenadas.
        En el ejemplo de la figura 2.2.2.4. si hago :

            puntos = curvas.GetPointsNumber( );

        en este caso puntos = 5.



CoordType GetPoint ( unsigned index )

        Además del offset cada punto en la lista tiene asociado un índice que va de 0 al número de puntos menos 1. Esta función retorna las coordenadas del punto cuyo índice en la lista es index.
En el ejemplo de la figura 2.2.2.4. tenemos:

                         Punto   índice    Coords     offset
                             1   --    0   --  ( 0,0 )    --  0
                             2   --    1   --  ( 10,0 )  --  0.265
                             3   --    2   --  ( 10,5 )  --  0.397
                             4   --    3   --  ( 0,10 )  --  0.693
                             5   --    4   --  ( 0,5 )    --  0.847

Entonces :

                    coord = curva.GetPoint ( 1 );

obtengo coord = ( 10 , 0 ).



double GetOffset ( unsigned index )

        Devuelve el offset correspondiente al punto cuyo índice en la lista de coordenadas es index.

En el ejemplo de la figura 2.2.2.4. si hacemos :

                    offset = curva.GetOffset( 2 );

obtengo offset = 0.397.



void ModifyPixels ( bicotiPixelOperatorUnary< PixelType > * ptr_op_unary )

    Esta función le aplica el operador a cada uno de los pixeles en la imagen, cuyas coordenadas pertenecen a la curva.
Se podría ver como que para cada punto de la curva cuyas coordenadas caen sobre un punto de la imagen, se hace :

        coord = curva( offset );
        pixel = ptr_imagen->GetPixel( coord );
        nuevo_pixel = (* ptr_op_unary )( pixel );
        ptr_image->SetPixel( coord, pixel );

El offset se hace variar de 0 a 1 con un paso adaptable de forma que queden cubiertos todos los puntos.
Aquí obviamos el hecho de que hay que interpolar en la imagen ya que las coordenadas son reales.
Ver ejemplos .