2.2 - Dexels


2.2.2 - bicotiDexelCurve

        Las curvas son dexeles que almacenan algunas coordenadas ( en cualquier dimensión ) referidas a una imagen y un criterio de interpolación entre ellas. Es decir que tenemos algunos puntos reales y una forma de estimar los restantes.
La Clase base es bicotiDexelCurve ( dericada de BicotiDexel ) y tiene una referencia a la imagen, una lista de coordenadas , una referencia a una clase que se encarga de interpolar en la lista de coordenadas y un interpolador para la imagen.

Figura 2.2.2.1

Cuando creo una curva tengo que pasarle una referencia a la imagen, un interpolador para la imagen, una vector de coordenadas y un interpolador 1D para coordenadas.

En la figura 2.2.2.2 se muestra una foto con 7 puntos marcados en el orden que indican los números.

Figura 2.2.2.2

Es muy importante el orden en que se pasan los puntos ya que la curva seguirá ese orden estricto.
En este ejemplo en 2D, los puntos tiene coordenadas :
               1 - ( 116 , 31 )
               2 - ( 168 , 59 )
               3 - ( 181 , 107 )
               4 - ( 156 , 147 )
               5 - ( 106 , 154 )
               6 - ( 67 , 122 )
               7 - ( 64 , 71 )
Por lo tanto debemos crear un vector ( de la STL ) de coordenadas 2D y llenarlo con estos valores.

    vector< bicotiCoordinate2D< REAL > > vect( 7 );

    vect[0].X0( ) = 116;
    vect[0].X1( ) = 31;

    vect[1].X0( ) = 168;
    vect[1].X1( ) = 59;

                .
                .

Las coordenadas deben ser de reales ya que la curva trabaja con números reales porque debe realizar interpolaciones, calcular el largo y derivadas.
Si se le pasan coordenadas enteras muchas de las funciones no funcionarán.

Para crear la curva primero debo crear un interpolador de coordenadas :

  bicotiCoordinateInterpolator1DOpen< bicotiCoordinate2D < REAL > > * ptr_coord_int;
  ptr_coord_int = new bicotiCoordinateInterpolator1DOpenLinear< bicotiCoordinate2D < REAL > >;

En este caso uso un interpolador lineal abierto. Ver Interpoladores de coordenadas para más detalles.

También debo crear un interpolador para la imagen.

  bicotiImagePixelInterpolator< int > * ptr_ima_int;
  ptr_ima_int = new  bicotiImagePixelInterpolator2DLinear< int >(ptr_ima );

El template del interpolador es el tipo de pixel de la imagen, entero en este caso.
Ver Interpoladores de Pixeles para más detalles.

La necesidad de un interpolador de pixeles es que como la curva trabaja con coordenadas reales, cuando queremos saber el valor del pixel ubicado en cierto punto de la curva, como esa coordenada generalmente no cae sobre un punto existnete, hay que estimarlo, para eso se usa el interpolador.

Luego podemos crear la curva.

  bicotiDexelCurveOpen< CT, PT > curve( ptr_ima, vect, ptr_coord_int, ptr_ima_int );

Puede observarse que en este caso creamos una curva abierta, por lo que empieza en el punto 1 y termina en el 7. Podríamos haber creado una cerrada, en cuyo caso empezaría y terminaría en el punto 1.
Se hace una especialización en curvas abiertas y cerradas porque conceptualmente hay algunas diferencias que luego aclararemos, por ejemplo se puede definir si un punto está adentro o no de una curva cerrada pero no de una abierta.

Por lo tanto para bicotiDexelCurve tendremos un arbol de herencia como se muestra en la figura 2.2.2.3.

Figura 2.2.2.3

La curva es una función que dado un real ( doble ) devuelve una coordenada de reales ( en 2D, 3D, etc ).
Por lo tanto tendremos :  Coordenada = f ( offset )
El offset es el parámetro de la curva, que se normaliza, por lo tanto offset debe estar entre 0 y 1 donde:
offset = 0 corresponde al primer punto
offset = 1 corresponde al último punto, que puede ser el primero si la curva es cerrada.
La curva tiene definida una una función :
           CoordType GetCoordinate ( double offset )
que nos devuelve la coordenada correspondiente al offset dado.
 
 
 
 
bicotiDexel
bicotiDexelCurve
bicotiDexelCurveOpen
bicotiDexelCurveClosed