cap9 menu+linea


CIRCULOS, ELIPSES

Los m‰todos definidos en Java para la realizacin de crculos y elipses, al igual que en la mayora de los lenguajes, reciben como parßmetros las coordenadas de la esquina superior-izquierda y el ancho y alto de la caja en la que se circunscribe el crculos o la elipse.

En el ejemplo siguiente, Ojos.java, podemos ver la r‰plica de la aplicacin conocida por los usuarios de Motif, en la que los ojos siguen los movimientos del ratn cuando se encuentra dentro del campo del applet.


Su navegador no entiende la marca <APPLET>, la siguiente imagen muestra la visualización de la ejecución del applet en pantalla
Ojos

import java.awt.*;
import java.applet.Applet;

public class Ojos extends Applet {
    int Mx = -1;
    int My = -1;
    int OjoR1;
    int OjoR2;
    int Ancho;
    int Alto;
    int OjoIzq;
    int OjoDch;
    int OjoPY;
    Color Pupila = Color.black;
    Color Iris = Color.green.brighter();
    Color Orbita = Color.white;
    Image Imagen;
    Graphics OjoCG;
                            

    public void init() {
        setBackground( Color.darkGray );
        Dimension d = size();
 
        // Fijamos las variables que nos van a posicionar los
        // ojos sobre el applet
        OjoIzq = d.width >> 2;
        OjoDch = OjoIzq * 3;
        OjoPY = d.height >> 2;

        OjoR2 = d.width >> 4;
        OjoR1 = d.width >> 5;
        Ancho = ( d.width >> 3 ) + OjoR1;
        Alto = Ancho >> 1;
        }


    public void update( Graphics g ) {
        paint( g );
        }

           
    // Funcion auxiliar, para que no se desmanden los valores
    // y no se los salgan los ojos de las orbitas
    int swap( int i,int c ) {
        if( i > c )
            i = c;
        else if( i < -c )
            i = -c;
      return( i );
      }


    // Pintamos el ojo sobre el applet
    void pintaOjo( Graphics g,int x ) {
        // Fijamos los desplazamientos, las nuevas posiciones de
        // referencia, en funcion de la posicion del cursor del
        // raton, determinada por Mx y My
        int dx = x-Mx;
        int dy = OjoPY-My;
                                      
        // Pintamos el ojo solamente bordeado, es decir, cerrado
        if( dx < Ancho  &&  dx > -Ancho  &&  dy < Alto  &&  dy > -Alto ) 
            {
            g.setColor( getBackground() );
            g.fillOval( x-Ancho,OjoPY-Alto,Ancho << 1,Alto << 1 );
            g.setColor( getBackground().brighter() );
            g.drawOval( x-Ancho,OjoPY-Alto,Ancho << 1,Alto << 1 );
            }
        else 
            {                                                   
            // Pintamos el hueco del ojo, por el que se movera el iris
            g.setColor( Orbita );
            g.fillOval( x-Ancho,OjoPY-Alto,Ancho << 1,Alto << 1 );

            int y = OjoPY;
            dx = swap( dx >> 3,OjoR1 << 1 );
            dy = swap( dy >> 5,OjoR1 >> 1 );
            if( Mx >= 0  &&  My >= 0 ) 
                {
                x -= dx;
                y -= dy;
                }                                                     

            // Pintamos el iris, sobre el que se movera la pupila
            g.setColor( Iris );
            g.fillOval( x-OjoR2,y-OjoR2,OjoR2 << 1,OjoR2 << 1 );
            if( Mx >= 0  &&  My >= 0 ) 
                {
                x -= ( dx >> 1 );
                y -= dy;
                }                                                

            // Pintamos la pupila dentro del iris
            g.setColor( Pupila );
            g.fillOval( x-OjoR1,y-OjoR1,OjoR1 << 1,OjoR1 << 1 );
            }
        }


    public void paint( Graphics g ) {
        Dimension d = size();
        
        // La primera vez que se llama a este metodo, todavia no
        // hay nada, asi que creamos el soporte de los ojos
        if( Imagen == null || OjoCG == null ) 
            {
            Imagen = createImage( d.width,d.height >> 1 );
            OjoCG = Imagen.getGraphics();
            }                                              

        // Pintamos los ojos
        OjoCG.setColor( getBackground() );
        OjoCG.fillRect( 0,0,d.width,d.height );
        pintaOjo( OjoCG,OjoIzq );
        pintaOjo( OjoCG,OjoDch );
        g.drawImage( Imagen,0,0,this );
        }

                                         
    // Cuando movemos el cursos dentro del applet, recibimos las 
    // coordenadas y repintamos el ojo
    public boolean mouseMove( Event evt,int x,int y ) {
        Mx = x;
        My = y;
        repaint();

        return true;
        }

                                      
    // Si nos llega el evento de que el raton se ha salido del applet
    // ponemos los todo en el centro, con los ojos espantados,
    // como si se hubiese visto al diablo
    public boolean mouseExit( Event evt,int x,int y ) {
        Mx = My = -1;
        repaint();

        return true;
        }
    }

Cada uno de los métodos que nos permiten representar en pantalla elipses y arcos, requieren como parámetros las coordenadas del punto central del óvalo o arco y el ancho y alto, en valor positivo, del rectángulo que circunscribe al óvalo o al arco, como hemos dicho. Para pintar arcos, necesitamos dos parámetros adicionales, un ángulo de inicio y un ángulo para el arco; de este modo especificamos el inicio del arco y en tamaño del arco en grados (no en radianes). En la figura que sigue mostramos cómo se tiene en cuanta el ángulo a la hora de las especificación de ángulos en los valores de los parámetros a pasar a los métodos drawArc() y fillArc().

arcos

El applet siguiente, FigElipse.java, nos permite manipular el comportamiento de estos métodos ante los valores que indiquemos en los parámetros que aceptan:


Tu navegador no entiende la marca <APPLET>. La imagen siguiente es la reproducción de la apariencia del applet en pantalla:
Applet drawArc()

linea2
menu
Tutorial de Java
[Anterior] [Indice] [Siguiente]
1