Páginas

NIMADRES

Mostrando entradas con la etiqueta programa en java. Mostrar todas las entradas
Mostrando entradas con la etiqueta programa en java. Mostrar todas las entradas

Hacer un Fractal en Java

Los fractales son entidades matemáticas que están por todas partes. Y, precisamente, por su variedad, son difíciles de definir porque no todos cumplen las mismas características, aunque hay algo en común: son el producto de la repetición de un proceso geométrico elemental que da lugar a una estructura final de una complicación extraordinaria. Es decir, da como resultado un conjunto cuya frontera es imposible dibujar a pulso (por ser de longitud infinita). Hay muchos objetos de la naturaleza que, debido a su estructura o comportamiento, son considerados fractales naturales aunque no lo parezcan: las nubes, las montañas, las costas, los árboles y los ríos. En lo que se diferencian de los fractales matemáticos es que éstos son entidades infinitas. para mas información :
http://www.sectormatematica.cl/fractales.html

En este programa se pretende simular como es que funciona un fractal, con una función recursiva dentro de un JPanel, esto con varios niveles de dificultad en la figura que mientras mas crece el nivel comienza a distorsionarse la figura, ademas se pueden cambiar los colores de las lineas con un JColorChooser.

Esta seria la salida del fractal ya con el nivel incrementado, aunque comenzando empieza con una linea recta!





import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public final class Fractal extends JFrame{
    private final int MIN_LEVEL = 0;
    private Color color = Color.BLUE;
    private JButton changeColorJButton;
    private JButton botonIncrementar; 
    private JButton botonDecrementar;
    private JLabel levelJLabel;
    private FractalJPanel drawSpace;
    private JPanel mainJPanel;
    private JPanel controlJPanel;
    
    public Fractal(){
        super("Fractal");
        initComponents();
        setBounds(250, 100, 400, 450);
        setVisible(true);
    }
    
    public void initComponents(){
        controlJPanel = new JPanel();
        controlJPanel.setLayout(new FlowLayout());
        controlJPanel.setBackground(Color.BLACK);
        cambiarColor();
        funcionDecrementar();
        funcionIncrementar();
        levelJLabel = new JLabel("Level: 0");
        levelJLabel.setForeground(Color.RED);
        levelJLabel.setFont(new Font("chiller", 1, 20));
        controlJPanel.add(levelJLabel);
        drawSpace = new FractalJPanel(0);
        mainJPanel =  new JPanel();
        mainJPanel.add(controlJPanel);
        mainJPanel.add(drawSpace);
        mainJPanel.setBackground(Color.BLACK);
        add(mainJPanel);
    }
    public void cambiarColor(){
        changeColorJButton =  new JButton("Color");
        controlJPanel.add(changeColorJButton);
        changeColorJButton.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                    color = JColorChooser.showDialog(
                            Fractal.this, "Chose a color", color);
                    if(color == null)
                        color = Color.BLUE;
                    drawSpace.setColor(color);
                } 
            }
        );
    }
    public void funcionIncrementar(){
        botonIncrementar = new JButton("Incrementar nivel");
        controlJPanel.add(botonIncrementar);
        botonIncrementar.addActionListener(
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int level = drawSpace.getLevel();
                    level++;
                    if(level >= MIN_LEVEL){
                        levelJLabel.setText("Level: " + level);
                        drawSpace.setLevel(level);
                        repaint();
                    }
                }
            }
        );
    }
    public void funcionDecrementar(){
        botonDecrementar = new JButton("decrementar nivel");
        controlJPanel.add(botonDecrementar);
        botonDecrementar.addActionListener(
            new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    int level = drawSpace.getLevel();
                    level--;
                    if(level >= MIN_LEVEL){
                        levelJLabel.setText("Level: " + level);
                        drawSpace.setLevel(level);
                        repaint();
                    }
                }   
            }  
        );
    }
    class FractalJPanel extends JPanel{
        private Color color;
        private int level;
        public FractalJPanel(int currentLevel){
            color = Color.BLUE;
            level = currentLevel;
            setBackground(Color.WHITE);
            setPreferredSize(new Dimension(400,400));
        }
        public void drawFractal(int level, int xA, int yA, int xB, int yB, Graphics g){
            if(level == 0)
                g.drawLine(xA, yA, xB, yB);
            else{
                int xC = (xA + xB)/ 2;
                int yC = (yA + yB)/ 2;
                int xD = xA + (xC - xA)/ 2 -(yC - yA)/ 2;
                int yD = yA + (yC - yA)/ 2 +(xC - xA)/ 2;
                drawFractal(level - 1, xD, yD, xA, yA, g);
                drawFractal(level - 1, xD, yD, xC, yC, g);
                drawFractal(level - 1, xD, yD, xB, yB, g);
            }
        }
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setColor(color);
            drawFractal(level,100,90,290,200,g);
        }
        public void setColor(Color c){
            color = c;
        }
        public void setLevel(int currentLevel){
            level = currentLevel;
        }
        public int getLevel(){
            return level;
        }
    }
}
Ahora solo guardamos en otro archivo la clase principal (Main.java) y listo para correr desde consola y listo.
import javax.swing.JFrame;
import javax.swing.UIManager;
public class Main {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {}
        Fractal fractal = new Fractal();
        fractal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Simular un Ecualizador en Java

Un ecualizador es un dispositivo que procesa señales de audio.
Modifica el contenido en frecuencias de la señal que procesa. Para ello, cambia las amplitudes de sus coeficientes de Fourier, lo que se traduce en diferentes volúmenes para cada frecuencia. Con esto se puede variar de forma independiente la intensidad de los tonos básicos.
Ciertos modelos de ecualizadores gráficos actúan sobre la fase de las señales que procesan, en lugar de actuar sobre la amplitud.

De un modo doméstico generalmente se usa para reforzar ciertas bandas de frecuencias, ya sea para compensar la respuesta del equipo de audio (amplificador + altavoces) o para ajustar el resultado a gustos personales.
Los hay analógicos y digitales, activos o pasivos, paramétricos, gráficos y paragráficos. Los ecualizadores profesionales suelen tener, al menos, 10 bandas. Las normas ISO establecen que las bandas de frecuencia han de ser, al menos, 31, 63, 125, 250, 500, 1000, 2000, 4000, 8000 y 16 000 Hercios.
Estas bandas de frecuencias básicas son controladas por un fader (u otro potenciómetro o control alternativo) que puede atenuar o introducir ganancia hasta en 12 dB, o aún más. Para evitar distorsión por saturación ("clipping"), cada fader cuenta con un diodo LED, que se enciende justo antes de que se recorte la señal.










Esta vez les traigo una pequeña aplicación en Java, que nos muestra como se comporta un ecualizador, estos se generan de manera aleatoria, el color se puede cambiar aunque eso es lo de menos. Esta aplicación esta hecha con un arreglo de hilos extendidos de JPanel en donde se dibujan rectangulos con el public void paint
El archivo se guarda como Ecualizador.java


import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class Ecualizador extends JFrame{
    public Ecualizador(){
        setTitle("NIMADRES");
        setVisible(true);
        setBounds(150,150,500,335);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(1, 10));
        Barra[]eqBar = new Barra[10];
        Thread[]Barra = new Thread[10];
        for(int i = 0; i<eqBar.length; i++){
            eqBar[i] = new Barra();
            Barra[i] = new Thread(eqBar[i]);
            Barra[i].start();
            this.add(eqBar[i]);
        }
    }
    class Barra extends JPanel implements Runnable{
        private int limite;
        private int inferior;
        private Rectangle rectangulo;
        public Barra(){
            setBackground(Color.BLACK);
            Random rand =  new Random();
            limite = rand.nextInt(300);
            inferior = 0;
            rectangulo = new Rectangle(0,400,250,inferior);
        }
        public void paint(Graphics g){
            super.paint(g);
            g.setColor(Color.yellow);
            //g.setColor(Color.red);
            g.fillRect((int) rectangulo.getX(), (int) rectangulo.getY(), 
            (int) rectangulo.getWidth(), (int) rectangulo.getHeight());
        }
        public void run(){
            try{
                while(true){
                    rectangulo.setLocation((int) rectangulo.getX(),
                    (int) rectangulo.getY()-5);
                    inferior += 5;
                    if(inferior > limite){
                        inferior = 0;
                        rectangulo.setLocation((int) rectangulo.getX(), 300);
                    }
                    rectangulo.setSize(48, inferior);
                    repaint();
                    Thread.sleep(10);
                }
            } catch(InterruptedException e) {}
        }
    }
}
Ahora en otro archivo generamos el Main para ejecutar nuestro programa, este se guarda como Main.java en la misma carpeta que el Ecualizador.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main{
    public static void main(String args[]){
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {}
        java.awt.EventQueue.invokeLater(new Runnable(){
                    @Override
            public void run(){
                new Ecualizador().setVisible(true);
            }
        });
    }
}