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