Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

lunes, 21 de abril de 2014

Gráficos. Animación de un fractal.

Esta vez crearemos un nuevo proyecto que consiste en una pequeña animación de un fractal tipo arbol. Se juega con el grosor de las "ramas", los grados de inclinación entre ellas y una velocidad de animación no constante (descelerada). Para ello como va siendo habitual usando Netbeans creamos un nuevo proyecto en el cual se utiliza un jFrame donde se le añade un jButton y un jPanel.


Codigo 1 (Principal.java)

package Animacio4;

public class Principal extends javax.swing.JFrame {

    int grados = 0;  //Inclinación arbol
    int depth = 9;   //Profundidad de las ramas
    double sep = 0;  //Grados de separacion entre ramas

    public Principal() {
        initComponents();
        this.setLocationRelativeTo(null); //Centrar pantalla        
    }

    private void initComponents() { ... }                     

    private void jButtonIniciarActionPerformed(java.awt.event.ActionEvent evt) {           
        grados = 0;
        sep = 0;
        for (int i = 0; i > -90; i--) {
            sep = (sep < 90) ? sep += 0.333 : sep;
            Dibujo.Dibujar(
                    jPanel1.getGraphics(),
                    jPanel1.getWidth() / 2,
                    jPanel1.getHeight(),
                    grados -= 1,
                    depth,
                    sep);
            try {
                Thread.sleep((int) sep); //Velocidad de la animación
            } catch (InterruptedException ex) {
            }
        }
    }                                              

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButtonIniciar;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration 

}


Codigo 2 (Dibujo.java):

package Animacio4;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Stroke;

public class Dibujo {

    public static void Dibujar(Graphics g, int x1, int y1, double angle, int depth, double sep) {
        //Salir cuando la profundidad a llegado al limite
        if (depth == 0) return;
        //Borra jPanel
        if (depth == 9) {
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, x1 * 2, y1);
        }
        
        Graphics2D g2 = (Graphics2D) g;
        //Tipo de pincel (grosor)
        Stroke stroke = new BasicStroke((float) depth);
        g2.setStroke(stroke);
        //Color azul
        g.setColor(Color.blue);
        //Filtro antialiasing
        g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON); 
        //Calculo coordenadas
        int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 5.0);
        int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 5.0);
        //Dibuja linia
        g2.drawLine(x1, y1, x2, y2);
        //Dibuja bifurcaciones (recursivo)
        Dibujar(g2, x2, y2, (angle - (sep)), depth - 1, sep);
        Dibujar(g2, x2, y2, (angle + (sep)), depth - 1, sep);
    }

}


Resultado:






No hay comentarios:

Publicar un comentario

Con la tecnología de Blogger.