Un problema normal en los grficos es que nosotros queremos dibujar un grfico con unas
determinadas coordenadas (por ejemplo, una funcin matemtica sin(x) va de 0.0 a 2*PI en el
eje x y de -1 a 1 en el eje y), mientras que los ordenadores se empean en ofrecernos
coordenadas de pixels. A las coordenadas de nuestro grfico las llamar coordenadas de
usuario.
Para facilitar este trabaja, he creado una interface EscalaGrafica con todos (es un decir) los
mtodos de pintado de Graphics. Una clase hija EscalaGraficaCartesiana implementa estos
metodos, pero haciendo la transformacin de coordenadas. De esta forma, si en vez de
dibujar directamente con Graphics, dibujamos con EscalaGraficaCartesiana, no debemos
preocuparnos de transformar coordenadas de usuario en pixels.
EscalaGraficaCartesiana se inicializa pasndole cuales queremos que sean las coordenadas
lmite de nuestro grfico. De esta forma, puede hacer las cuentas para transformar las
coordenadas nuestras en pixels.
EscalaGraficaescala=newEscalaGraficaCartesiana();
escala.tomaExtremos(0.0,1.0,2*Math.PI,1.0);
Ni en EscalaGrafica ni en EscalaGraficaCartesiana estn implementados todos los mtodos
de Graphics. Es algo que tengo que aadir...
LOS OBJETOS GRAFICOS
He hecho tambin una interface ObjetoGrafico. Esta interface tiene un nico mtodo
dibujate(), que recibe una EscalaGrafica. Cualquier cosa que queramos dibujar debera ser
una clase que implemente esta interface. En el mtodo dibujate() debe dibujar lo que se quiera
dibujar, pero siempre en coordenadas de usuario. No debemos preocuparnos de transformar a
pixels.
Como ejemplos, he creado varios ObjetoGrafico que ya estn disponibles para utilizar, aunque
no son demasiado sofistificados:
RejillaFija, dibuja una rejilla sobre nuestra rea de dibujo, poniendo nmeros en las
coordenadas.
FuncionAbstracta, dibuja cualquier funcin matemtica del estilo y=f(x). Hay que
heredar de ella y redefinir el mtodo funcion(), que devuelve la y en funcin de la x.
Tarta, dibuja un grfico de tarta pasndolo un array de nmeros, de forma que cada
nmero es una porcin de la tarta.
Una clase Cursor, que sirve de padre para CursorHilo y CursorZoom. El primero es
una linea vertical, horizontal o ambas a la vez que se mueven con el ratn, permitiendo
marcar dos posiciones, usando botn izquierdo y derecho del ratn. El segundo hace
que se dibuje un rectngulo segn arrastramos en el grfico con el ratn, y al terminar
hace zoom de la zona en el rectngulo.
Una Mano, que sirve para poder arrastrar un grfico con el ratn.
EL LIENZO DE DIBUJO
Como componente de dibujo he creado un Lienzo, que hereda de JLayeredPane. Tiene dos
capas de dibujo, para poder hacer un dibujo de fondo y otro por encima que normalmente es
algn tipo de cursor que se mueve con el ratn. Este Lienzo se inicializa pasndole la
EscalaGrafica que queramos (con sus lmites de las coordendas de usuario). Admite que le
aadamos todos los ObjetoGrafico que queramos. El Lienzo, cuando necesite repintado,
llamar a todos los dibujate() de los ObjetoGrafico que tiene en su interior y presentar el
dibujo en pantalla.
Lienzolienzo=newLienzo();
lienzo.tomaEscala(escala);
Histogramahistograma=newHistograma(...);
lienzo.tomaObjetoGrafico(histograma);
BOTONES DE ZOOM
He hecho un boton de zoom que permite acercar o alejar el grfico. Se les inicializa
pasndoles la misma EscalaGrafica que se pasa al Lienzo y el porcenaje de acercamiento o
alejamiento que se desea cada vez que se pulse.
ZoomPorcentajeacercar=newZoomPorcentaje(escala,10);
ZoomPorcentajealejar=newZoomPorcentaje(escala,10);
Es fcil implementar (y lo har) unos botones de zoom inicial y zoom previo.
INTENCIONES FUTURAS
Algunos objetos grficos ms, segn los vaya necesitando para probar las nuevas
implementaciones.
Ms abajo tienes tanto el jar como los fuentes. Si haces alguna modificacin interesante,
aades alguna funcionalidad o corriges algn error, por favor, envamela y la aadir en esta
pgina.