Monday, December 12, 2011

Sierpinski Triangle

Jumat, 9 November lalu kelas D SI ITS menjalani praktikum yang lumayan menguras otak dan tenaga. Bagaimana tidak, 5 jam dihabiskan untuk membuat 2 program yang diperintahkan. Salah satunya adalah Segitiga Sierpinski. Segitiga Sierpinski ini merupakan sebuah fraktal. Apa itu fraktal ? fraktal adalah benda geometris yang kasar pada segala skala, dan terlihat dapat "dibagi-bagi" dengan cara yang radikal. Beberapa fraktal bisa dipecah menjadi beberapa bagian yang semuanya mirip dengan fraktal aslinya. Fraktal dikatakan memiliki detail yang tak hingga dan dapat memiliki struktur serupa diri pada tingkat perbesaran yang berbeda. Pada banyak kasus, sebuah fraktal bisa dihasilkan dengan cara mengulang suatu pola, biasanya dalam proses rekursif atau iteratif.



Sesuai dengan namanya, segitiga Sierpinski di gambarkan untuk pertama kalinya oleh seorang matematikawan Waclaw Polandia, Sierpinski pada tahun 1915. Segitiga ini dibuat melalui metode rekursi dimana pada segitiga utama tiap sisi-sisinya dibagi dua untuk membuat titik-titik baru, kemudian dari ketiga sisi yang terbentuk, saling dihubungkan menjadi sebuah segitiga yang lebih kecil sehingga terbentuk 3 segitiga di pinggir dan satu segitiga paling besar ditengah, demikian seterusnya untuk segitiga-segitiga yang terletak di pinggir/sudut segitiga besar dilakukan proses serupa.

gb. segitiga sierpinski


Rumus yang digunakan untuk menentukan tiga titik tersebut adalah dengan menambahkan kedua koordinat x pada masing-masing ujung sisi yang bersangkutan kemudian dibagi dua, demikian untuk koordinat y juga dengan menambahkan koordinat y dari masing-masing ujung sisi yang bersnagkutan kemudian dibagi dua.


Untuk membuat program ini diperlukan adanya pengkodean dengan bahasa java, hingga menghasilkan segitiga sierpinski dengan inputan yang diinginkan. Berikut kode yang saya kerjakan kemarin.

Kelas Pertama :
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fractals;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

/**
 *
 * @author edwinafa
 */
public class fractals extends JPanel {

    private int Level;
    private Color color;
    private final int WIDHT = 700;
    private final int HEIGHT = 600;

    public fractals(int currentLevel) {
        color = Color.BLUE;
        Level = currentLevel;
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(WIDHT, HEIGHT));
    }

    public void setColor(Color c) {
        color = c;
    }

    public void setLevel(int currentLevel) {
        Level = currentLevel;
    }

    public int getLevel() {
        return Level;
    }

    public void gbFractal(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3, int Level) {
        if (Level == 0) {
            g.drawLine(x1, y1, x2, y2);
            g.drawLine(x2, y2, x3, y3);
            g.drawLine(x3, y3, x1, y1);
            return;
        }
        int xa, ya, xb, yb, xc, yc;
        xa = (x1 + x2) / 2;
        ya = (y1 + y2) / 2;
        xb = (x1 + x3) / 2;
        yb = (y1 + y3) / 2;
        xc = (x2 + x3) / 2;
        yc = (y2 + y3) / 2;
        gbFractal(g, x1, y1, xa, ya, xb, yb, Level - 1);
        gbFractal(g, xa, ya, x2, y2, xc, yc, Level - 1);
        gbFractal(g, xb, yb, xc, yc, x3, y3, Level - 1);
    }

    public void paint(Graphics g) {

        g.setColor(color);

        gbFractal(g, 319, 0, 30, 479, 669, 479, Level);
    }
}

kemudian kelas kedua yaitu berfungsi untuk memanggil kelas pertama dengan penciptaan objek turunan kelas pertama :
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fractals;

import java.awt.Color;
import java.awt.FlowLayout;
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.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author edwinafa
 */
public class Utama extends JFrame {

    private final int WIDTH =700;
    private final int HEIGHT = 650;
    private final int MIN_level = 0;
    private Color color = Color.BLUE;
    private JButton gantiWarnaJButton, naiklevelJButton, turunLevelJButton;
    private JLabel levelJLabel;
    private fractals gambar;
    private JPanel utamaJPanel, controlJPanel;

    public Utama() {
        super("Fractal");

        controlJPanel = new JPanel();
        controlJPanel.setLayout(new FlowLayout());

        gantiWarnaJButton = new JButton();
        gantiWarnaJButton.setText("ganti warna");
        controlJPanel.add(gantiWarnaJButton);
        gantiWarnaJButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                color = JColorChooser.showDialog(Utama.this, "pilih warna", color);

                if (color == null)
                    color = Color.BLUE;
               
                    gambar.setColor(color);
               
            }
        });

        turunLevelJButton = new JButton();
        turunLevelJButton.setText("kurangi level");
        controlJPanel.add(turunLevelJButton);
        turunLevelJButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                int level = gambar.getLevel();
                level--;

                if (level >= MIN_level) {
                    levelJLabel.setText("level " + level);
                    gambar.setLevel(level);
                    repaint();
                }
            }
        });

        naiklevelJButton = new JButton();
        naiklevelJButton.setText("tambah level");
        controlJPanel.add(naiklevelJButton);
        naiklevelJButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent event) {
                int level = gambar.getLevel();
                level++;

                if (level >= MIN_level) {
                    levelJLabel.setText("level " + level);
                    gambar.setLevel(level);
                    repaint();
                }
            }
        });

        levelJLabel = new JLabel("level : 0");
        controlJPanel.add(levelJLabel);

        gambar = new fractals(0);

        utamaJPanel = new JPanel();
        utamaJPanel.add(controlJPanel);
        utamaJPanel.add(gambar);

        add(utamaJPanel);
        setSize(WIDTH, HEIGHT);
        setVisible(true);
    }

    public static void main(String[] args) {
        Utama utamaBaru = new Utama();
        String input = JOptionPane.showInputDialog("level berapa :");
        int level = Integer.parseInt(input);
        utamaBaru.gambar.setLevel(level);
        utamaBaru.gambar.repaint();
        utamaBaru.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

setelah di run akan muncul tampilan sebagai berikut :
gb.tampilan pertama, hanya terlihat segitiga
dan permintaan masukan nilai kedalaman

gb. ketika sudah diberikan nilai kedalaman



gb. pemilihan warna setelah tombol ganti warna ditekan
gb. segitiga Sierpinski berubah warna

3 comments :