Fractalet ( Source Code )
ちょっとした説明
この"Fractalet"は以下の4つのクラスからできています。
Revi
import java.awt.*;
import javax.swing.*;
public class Revi extends JPanel {
/**フィールド*/
private int repeat;
SubPanel sub; //サブパネル
/**コンストラクタ*/
public Revi() {
repeat = 0;
setBackground(Color.white); //背景色を設定
setPreferredSize(new Dimension(400, 400));
//パネルの推奨サイズを設定
sub = new SubPanel(this);
}
/**メソッド*/
/**
* 描画内容
* @param g Graphics
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
drawRevi(getWidth() / 3, getHeight() * 3 / 5,
getWidth() * 2 / 3,getHeight() * 3 / 5, repeat, g);
//繰り返し回数がrepeatのレビィ曲線を書く
sub.setLabel();
}
/**
* 再帰的にレビィ曲線を書く
* @param oX int 開始位置(X座標)
* @param oY int 開始位置(Y座標)
* @param eX int 終了位置(X座標)
* @param eY int 終了位置(Y座標)
* @param n int 繰り返し回数
* @param g Graphics
*/
public void drawRevi
(int oX, int oY, int eX, int eY, int n, Graphics g) {
if (n == 0) {
g.drawLine(oX, oY, eX, eY);
} else {
int rX, rY;
rX = (eX + eY + oX - oY) / 2;
rY = (eY + oX + oY - eX) / 2;
drawRevi(oX, oY, rX, rY, n - 1, g);
drawRevi(rX, rY, eX, eY, n - 1, g);
}
}
/**
* 繰り返し回数を返す
* @return int 繰り返し回数
*/
int getRepeat(){
return repeat;
}
/**
* 繰り返しの回数を一回増やす
* ただし、20回以上には増やさない、処理が遅いから
*/
void repeatUp() {
if (repeat < 20) { //
repeat++;
}
}
/**繰り返しの回数を一回減らす
* ただし、0回未満にしない
*/
void repeatDown() {
if (repeat > 0) {
repeat--;
}
}
/**
* メイン関数
* @param args String[]特に意味はない
*/
public static void main(String args[]) {
JFrame frame = new JFrame("FRACTAL-Revi");
Revi revi = new Revi();
Container cont = frame.getContentPane();
cont.setLayout(new BorderLayout());
cont.add(revi,BorderLayout.CENTER);
cont.add(revi.sub,BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//ウィンドウを閉じたときプログラムを終了
frame.pack();
frame.setVisible(true);
}
}
SubPanel
import java.awt.*;
import javax.swing.*;
/**サブパネル(ボタンやラベルなど)のクラス*/
class SubPanel extends JPanel {
/**フィールド*/
private JLabel repeatLabel;
private JButton up, down;
private Revi revi;
private ReviEvent fe;
/**
* コンストラクタ
* @param r Revi メインのパネル
*/
public SubPanel(Revi r) {
revi = r;
fe = new ReviEvent(revi);
repeatLabel = new JLabel();//ボタンやラベルの設定
up = new JButton("UP");
down = new JButton("DOWN");
up.setActionCommand("UP");
down.setActionCommand("DOWN");
up.addActionListener(fe);
down.addActionListener(fe);
setLabel();
add(repeatLabel);
add(up);
add(down);
}
void setLabel() {
repeatLabel.setText("repaet = " + revi.getRepeat());
}
}
ReviEvent
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ReviEvent implements ActionListener {
private Revi revi;
public ReviEvent(Revi r){
revi = r;
}
/**
* イベントが起きたときの処理内容
* @param e ActionEvent
*/
public void actionPerformed(ActionEvent e) {
String command=e.getActionCommand();
if(command.equals("UP")){
revi.repeatUp();
revi.repaint();
}
if(command.equals("DOWN")){
revi.repeatDown();
revi.repaint();
}
}
}
Fractalet
import java.awt.*;
import javax.swing.*;
public class Fractalet extends JApplet {
//アプレットの初期化
public void init(){
Revi revi = new Revi();//フラクタルを表示するパネルを作る
Container cont = getContentPane();//コンテントペインを得る
cont.add(revi,BorderLayout.CENTER);//コンテントペインにReviを追加
cont.add(revi.sub,BorderLayout.SOUTH);//コンテントペインにsubを追加
setVisible(true);//可視化
}
}