Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Antoniio03 en 05 de Mayo 2016, 23:05

Título: Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer
Publicado por: Antoniio03 en 05 de Mayo 2016, 23:05
Hola, buenas. Estoy intentanto hacer una versión de la "Alfombra de Sierpinski":
https://es.wikipedia.org/wiki/Alfombra_de_Sierpinski (https://es.wikipedia.org/wiki/Alfombra_de_Sierpinski)


Este es el código que tengo:

Código: [Seleccionar]
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
 
public class SierpinskiCarpet extends JPanel {
    private final int dim = 513;
    private final int margin = 20;
 
    private int limit = dim;
 
    public SierpinskiCarpet() {
        setPreferredSize(new Dimension(dim + 2 * margin, dim + 2 * margin));
        setBackground(Color.white);
        setForeground(Color.black);
 
        new Timer(2000, (ActionEvent e) -> {
            limit /= 3;
            if (limit <= 3)
                limit = dim;
            repaint();
        }).start();
    }
 
    void drawCarpet(Graphics2D g, int x, int y, int size) {
        if (size < limit)
            return;
        size /= 3;
        for (int i = 0; i < 9; i++) {
            if (i == 4) {
                g.fillRect(x + size, y + size, size, size);
            } else {
                drawCarpet(g, x + (i % 3) * size, y + (i / 3) * size, size);
            }
        }
    }
 
    @Override
    public void paintComponent(Graphics gg) {
        super.paintComponent(gg);
        Graphics2D g = (Graphics2D) gg;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.translate(margin, margin);
        drawCarpet(g, 0, 0, dim);
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setTitle("Sierpinski Carpet");
            f.setResizable(false);
            f.add(new SierpinskiCarpet(), BorderLayout.CENTER);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}

El color de los cuadrados es blanco y negro seleccionado por mi. Mi duda es, cómo hacer que el usuario elija el color de los cuadros??

Gracias de antemano !
Título: Re:Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer
Publicado por: César Krall en 07 de Mayo 2016, 21:45
Hola!

No es complicado, puedes hacerlo tanto por consola como usando una ventana por ejemplo un JOptionPane. Para la comprensión de conceptos recomendamos seguir este curso: http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188

Te dejo el código con un ejemplo añadido usando entrada de usario por consola (no está bien programado, es solo para ver el ejemplo de cómo elegir color):

Código: [Seleccionar]
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.util.Scanner;

public class SierpinskiCarpet extends JPanel {
    private final int dim = 513;
    private final int margin = 20;
    private static Color colorElegido;
    private int limit = dim;

    public SierpinskiCarpet() {
        setPreferredSize(new Dimension(dim + 2 * margin, dim + 2 * margin));
        setBackground(Color.white);
        setForeground(colorElegido);
        new Timer(2000, (ActionEvent e) -> {
                limit /= 3;
                if (limit <= 3)
                    limit = dim;
                repaint();
            }).start();
    }

    void drawCarpet(Graphics2D g, int x, int y, int size) {
        if (size < limit)
            return;
        size /= 3;
        for (int i = 0; i < 9; i++) {
            if (i == 4) {
                g.fillRect(x + size, y + size, size, size);
            } else {
                drawCarpet(g, x + (i % 3) * size, y + (i / 3) * size, size);
            }
        }
    }

    @Override
    public void paintComponent(Graphics gg) {
        super.paintComponent(gg);
        Graphics2D g = (Graphics2D) gg;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g.translate(margin, margin);
        drawCarpet(g, 0, 0, dim);
    }

    public static void main(String[] args) {
        Color color1 = Color.blue;
        Color color2 = Color.orange;
        System.out.println("Elige ¿azul o naranja?");
        Scanner sc = new Scanner(System.in);

        String elegido = sc.nextLine();
        if (elegido.equals("azul")){
            colorElegido = color1;
        } else { colorElegido=color2; }

        SwingUtilities.invokeLater(() -> {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setTitle("Sierpinski Carpet");
                f.setResizable(false);
                f.add(new SierpinskiCarpet(), BorderLayout.CENTER);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            });
    }
}

Saludos!
Título: Re:Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer
Publicado por: Antoniio03 en 08 de Mayo 2016, 07:59
Vaya, ya veo, muchas gracias por responder. Lo único que no pude arreglar es diferenciar entre las minúsculas y mayúsculas, por ejemplo, si elijo "Rojo" me manda el color en gris porque no lo lee como "rojo", cómo puedo solucionar eso??

Así lo dejé:
Código: [Seleccionar]
import java.awt.*;import java.awt.event.ActionEvent;
import javax.swing.*;
import java.util.Scanner;


public class SierpinskiCarpet extends JPanel {
    private final int dim = 513;
    private final int margin = 20;
    private static Color colorRelleno;
    private static Color colorFondo;
    private int limit = dim;


    public SierpinskiCarpet() {
        setPreferredSize(new Dimension(dim + 2 * margin, dim + 2 * margin));
        setBackground(colorFondo);
        setForeground(colorRelleno);
        new Timer(2000, (ActionEvent e) -> {
                limit /= 3;
                if (limit <= 3)
                    limit = dim;
                repaint();
            }).start();
    }


    void drawCarpet(Graphics2D g, int x, int y, int size) {
        if (size < limit)
            return;
        size /= 3;
        for (int i = 0; i < 9; i++) {
            if (i == 4) {
                g.fillRect(x + size, y + size, size, size);
            } else {
                drawCarpet(g, x + (i % 3) * size, y + (i / 3) * size, size);
            }
        }
    }


    @Override
    public void paintComponent(Graphics gg) {
        super.paintComponent(gg);
        Graphics2D g = (Graphics2D) gg;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g.translate(margin, margin);
        drawCarpet(g, 0, 0, dim);
    }


    public static void main(String[] args) {
        Color color1 = Color.blue; Color color2 = Color.orange;Color color3 = Color.red;Color color4 = Color.black;
        Color color5 = Color.yellow;Color color6 = Color.green;Color color7 = Color.pink;
       
        System.out.println("Elije el color del relleno de la figura: ");
        Scanner sc = new Scanner(System.in);
       
        System.out.println("Elije el color del fondo de la figura: ");
        Scanner fo = new Scanner(System.in);
       
         String elegido2 = sc.nextLine();
        if (elegido2.equals("azul")){
            colorRelleno = color1;
        }
       if (elegido2.equals("rojo")){
            colorRelleno = color3;
       }
       if (elegido2.equals("naranja")){
            colorRelleno = color2;
       }
       if (elegido2.equals("negro")){
            colorRelleno = color4;
       }
       if (elegido2.equals("amarillo")){
           colorRelleno = color5;
       }
       if (elegido2.equals("verde")){
          colorRelleno = color6;
        }
       if (elegido2.equals("rosa")){
           colorRelleno = color7;
        }
       
        String elegido = fo.nextLine();
        if (elegido.equals("azul")){
            colorFondo = color1;
        }
       if (elegido.equals("rojo")){
            colorFondo = color3;
       }
       if (elegido.equals("naranja")){
            colorFondo = color2;
       }
       if (elegido.equals("negro")){
            colorFondo = color4;
       }
       if (elegido.equals("amarillo")){
            colorFondo = color5;
       }
       if (elegido.equals("verde")){
            colorFondo = color6;
        }
       if (elegido.equals("rosa")){
            colorFondo = color7;
        }


       
        SwingUtilities.invokeLater(() -> {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setTitle("Sierpinski Carpet");
                f.setResizable(false);
                f.add(new SierpinskiCarpet(), BorderLayout.CENTER);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            });
    }
}
Título: Re:Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer
Publicado por: César Krall en 08 de Mayo 2016, 10:55
Hola! Basta con usar equalsIgnoreCase puedes ver un ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=2912.0

Saludos!
Título: Re:Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer
Publicado por: Antoniio03 en 08 de Mayo 2016, 18:32
Perfecto, ya lo tengo. Muchas Gracias !!