Anda di halaman 1dari 4

LAS COORDENADAS DE USUARIO Y LOS PIXELS

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.

Seno, es una implementacin de la clase anterior para dibujar la funcin seno.

Tarta, dibuja un grfico de tarta pasndolo un array de nmeros, de forma que cada
nmero es una porcin de la tarta.

Histograma, dibuja un grfico de columnas pasndole un array de nmeros, de forma


que cada nmero tiene su columna.

LOS OBSERVADORES DE RATON


He hecho una interface ObservadorRaton. Esta interface tiene el mtodo eventoRaton(), al
que se le pasa el evento de ratn y las coordenadas x,y de usuario en las que se ha producido
el evento. El mtodo debe devolver true si el tratamiento del evento hace que se necesite un
repintado del grfico y false en caso contrario.
Como ejemplos, he creado varios ObservadorRaton

Un VisorRaton, que es un JTextField en el que se puede ver la coordenada x o y por


donde se mueve el ratn, en coordenadas de usuario.

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

Mejorar la EscalaGraficaPolar y hacer algo para dibujo en 3D

Algunos objetos grficos ms, segn los vaya necesitando para probar las nuevas
implementaciones.

Posibilidad de dibujo en los mrgenes (escalas, ttulos, etc).

Mostrar unidades para los ejes.

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.

Anda mungkin juga menyukai