1 - Componentes Básicos

1.1 - Coordenadas

    Las Coordenadas son componentes fundamentales en la biblioteca. Aparecerán en todas las estructuras y algoritmos donde se necesite conocer información espacial de los Pixels en una imagen.
Al tratarse de un bloque de muy bajo nivel , las clases pueden usarse independientemente de todos los demás bloques.

    Se han implementado esencialmente coordenadas cartesianas en N dimensiones.
    Como se indica en la figura 1.1 la estructura jerárquica es:

        - bicotiCoordinate
            - bicotiCoordinate2D
            - bicotiCoordinate3D
            - bicotiCoodinateVectorialStatic

                                                                     Figura 1.1
 

         Conceptualmente una coordenada es una array de algún tipo. Este tipo podría en principio ser
cualquiera ya que la clase está parametrizada en un "template" ( CoordComponentType ), pero todo el funcionamiento se ha pensado para que el CoordComponentType sea un tipo básico, principalmente enteros y flotantes. Sin embargo podrían usarse sin problemas clases que definan algunos operadores de los tipos básicos. Véase la especificación detallada de "bicotiCoordinate" para saber en detalle las restricciones de CoordComponentType.

La diferencia más destacable entre las cuatro clases implementadas es en la forma de alojar memoria.
Algunas pruebas de performance han mostrado que es mas eficiente, en términos de tiempos, y produce menos fraccionamineto de memoria, tener almacenadas las componentes en variables distintas o en un array estático, cuyo tamaño se fija en tiempo de compilación.
Esta idea se usa en las tres clases derivadas.

    bicotiCoordinate2D y bicotiCoordinate3D almacenan las componentes como variables internas independientes. Es decir algo como :

    class bicotiCoordinate2D
    {
        private:
              CoordComponentType  x0;
              CoordComponentType  x1;
                               .
                               .
                               .

    Por otro lado bicotiCoordinateVectorialStatic almacena las variables en un Array estático.

    class bicotiCoordinateVectorialStatic
    {
        private:
              CoordComponentType  components[ dim ];
                               .
                               .
                               .

Para que el array sea estático, el tamaño debe conocerse en tiempo de compilación, por lo tanto esta clase tiene un segundo parámetro ( "template" ) para indicar la dimensión, el entero "dim".
Las coordenadas estáticas tienen la ventaja que pueden usarse para cualquier dimensión, y podrían ser de utilidad en algún algoritmo donde no alcance con 2D o 3D , pero es importante destacar que si se desea usar por ejemplo una coordenada 4D, como una componente importante en alguna estructura o algoritmo, siempre será más eficiente crear una nueva especialización al estilo 2D y 3D que usar un coordenada estática.
 

    Ahora, cuando sea necesaria una coordenada de dimensión variable o conocida solo en tiempo de ejecución, hay que alojar los componentes en un array dinámico ( de largo variable ). Esta implementación fué la que se adoptó para la clase base "bicotiCoordinate"  ( no es abstracta ).

    class bicotiCoordinate
    {
        private:
          CoordComponentType * ptr_components;
          unsigned dimension;
                               .
                               .
                               .
 

  Ver descripción de clases

        - bicotiCoordinate
            - bicotiCoordinate2D
            - bicotiCoordinate3D
            - bicotiCoodinateVectorialStatic