Autor Tema: Alfombra de sierpinski algoritmo recursivo código Java con JPanel y Timer  (Leído 6918 veces)

Antoniio03

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Hola, buenas. Estoy intentanto hacer una versión de la "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 !
« Última modificación: 07 de Mayo 2016, 21:25 por César Krall »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
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!
Responsable de departamento de producción aprenderaprogramar.com

Antoniio03

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
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);
            });
    }
}
« Última modificación: 08 de Mayo 2016, 09:17 por Antoniio03 »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola! Basta con usar equalsIgnoreCase puedes ver un ejemplo en https://www.aprenderaprogramar.com/foros/index.php?topic=2912.0

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

Antoniio03

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Perfecto, ya lo tengo. Muchas Gracias !!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".