bicotiDexel
bicotiDexelCurve
bicotiDexelCurveOpen
bicotiDexelCurveClosed
Templates Clases
CoordType
PixelType
class bicotiDexelCurve < class CoordType , class PixelType >
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 )
unsigned
GetPointsNumber ( )
CoordType
GetPoint ( unsigned )
double
GetOffset ( unsigned )
void
ModifyPixels ( bicotiPixelOperatorUnary<
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.
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( );
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.
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.
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.
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.
Hace lo mismo que operator ( )
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.
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.
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.
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 .
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( );
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.
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.
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.
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 ).
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.
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 .