Java: Koch Snowflakes Fractal source
Posted by megahacker136 on September 2, 2008
Source code:
import java.awt.*;
import javax.swing.*;
/*
* koch.java
*
* Created on August 17, 2008, 9:29 AM
*/
/**
*
* @author Megahacker
*/
public class koch extends javax.swing.JFrame {
drawKoch draw = new drawKoch();
int nxt = 0;
int[] s = {600, 100, 50, 10, 5, 3, 2, 1};
/** Creates new form koch */
public koch() {
initComponents();
panel2.add(draw);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate=”collapsed” desc=”Generated Code”>//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
panel1 = new javax.swing.JPanel();
resetBtn = new javax.swing.JButton();
backBtn = new javax.swing.JButton();
nextBtn = new javax.swing.JButton();
panel2 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle(“Koch Snowflakes Fractal”);
setResizable(false);
panel1.setLayout(new java.awt.GridBagLayout());
resetBtn.setText(“Reset”);
resetBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
resetBtnActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
panel1.add(resetBtn, gridBagConstraints);
backBtn.setText(“Back”);
backBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
backBtnActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
panel1.add(backBtn, gridBagConstraints);
nextBtn.setText(“Next”);
nextBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
nextBtnActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
panel1.add(nextBtn, gridBagConstraints);
getContentPane().add(panel1, java.awt.BorderLayout.CENTER);
panel2.setPreferredSize(new java.awt.Dimension(600, 600));
panel2.setLayout(new javax.swing.BoxLayout(panel2, javax.swing.BoxLayout.LINE_AXIS));
getContentPane().add(panel2, java.awt.BorderLayout.PAGE_START);
pack();
}// </editor-fold>//GEN-END:initComponents
private void resetBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetBtnActionPerformed
// TODO add your handling code here:
draw.size = 600;
draw.repaint();
}//GEN-LAST:event_resetBtnActionPerformed
private void nextBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextBtnActionPerformed
// TODO add your handling code here:
nxt++;
draw.size = s[nxt];
draw.repaint();
int num = draw.size;
backBtn.setEnabled(true);
if (num == 1) {
nextBtn.setEnabled(false);
}
}//GEN-LAST:event_nextBtnActionPerformed
private void backBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backBtnActionPerformed
// TODO add your handling code here:
nxt–;
draw.size = s[nxt];
draw.repaint();
int num = draw.size;
nextBtn.setEnabled(true);
if (num == 600) {
backBtn.setEnabled(false);
}
}//GEN-LAST:event_backBtnActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new koch().setVisible(true);
}
});
}
// Variables declaration – do not modify//GEN-BEGIN:variables
private javax.swing.JButton backBtn;
private javax.swing.JButton nextBtn;
private javax.swing.JPanel panel1;
private javax.swing.JPanel panel2;
private javax.swing.JButton resetBtn;
// End of variables declaration//GEN-END:variables
}
class drawKoch extends JPanel {
int size = 600;
public drawKoch() {
}
private koordinat mid(koordinat a, koordinat b) {
return new koordinat((a.x + b.x) / 2, (a.y + b.y) / 2);
}
private koordinat third(koordinat a, koordinat b) {
return new koordinat((b.x – a.x) / 3 + a.x, (b.y – a.y) / 3 + a.y);
}
private double dist(koordinat a, koordinat b) {
return Math.sqrt(Math.pow(b.x – a.x, 2) + Math.pow(b.y – a.y, 2));
}
private void drawKochSide(Graphics2D g2, koordinat a, koordinat b) {
if (dist(a, b) <= size) {
g2.drawLine((int) a.x, (int) a.y, (int) b.x, (int) b.y);
} else {
koordinat c = new koordinat(Math.cos(Math.PI / 3.0 + Math.atan2(b.y – a.y, b.x – a.x)) * (dist(a, b) / 3) + third(a, b).x,
Math.sin(Math.PI / 3.0 + Math.atan2(b.y – a.y, b.x – a.x)) * (dist(a, b) / 3) + third(a, b).y);
drawKochSide(g2, a, third(a, b));
drawKochSide(g2, third(a, b), c);
drawKochSide(g2, c, mid(third(a, b), b));
drawKochSide(g2, mid(third(a, b), b), b);
}
}
@Override
public void paintComponent(Graphics g) {
double w = getSize().getWidth();
double h = getSize().getHeight();
g.setColor(Color.BLACK);
g.fillRect(0, 0, (int) w, (int) h);
g.setColor(Color.YELLOW);
Graphics2D g2 = (Graphics2D) g;
double ox = 0.0, oy = 0.0;
if ((w * 2.0 * Math.sqrt(3.0)) < h * 3.0) {
h = (w * 2.0 * Math.sqrt(3.0)) / 3.0;
oy = (getSize().getHeight() – 1 – h) / 2.0;
}
if ((w * 2.0 * Math.sqrt(3.0)) > h * 3.0) {
w = (h * 3.0) / (2 * Math.sqrt(3.0));
ox = (getSize().getWidth() – 1 – w) / 2.0;
}
drawKochSide(g2, new koordinat(w / 2.0 + ox, oy), new koordinat(ox, h * 0.75 + oy));
drawKochSide(g2, new koordinat(w + ox, h * 0.75 + oy), new koordinat(w / 2.0 + ox, oy));
drawKochSide(g2, new koordinat(ox, h * 0.75 + oy), new koordinat(w + ox, h * 0.75 + oy));
}
}
class koordinat {
public double x, y;
public koordinat(double x, double y) {
this.x = x;
this.y = y;
}
}
Output preview:









TMUkmkd said
aku link masuk dalam blog aku la ko punya ni. yang bm punya dah siap kata la. aku nak link gak wakakka. tapi ambik yang bi je la sekarang ni.