「プログラムでシダを描画する」をJavaで描画する(AWT)

> 空前のシダ描画ブーム到来！？(^^;)
> あなたも得意なプログラミング言語でシダを描画してみよう！

Javaのプログラムがまだ出てないようなので、[Emacs Lisp版](http://qiita.com/akmiyoshi/items/ff4df934a5a89aaafbcb)に続いてJava (AWT)で書いてみました。
Javaアプレットが流行ってた頃を思い出すなぁｗ
(バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)

![2014-0604-0422.png](https://qiita-image-store.s3.amazonaws.com/0/32879/3e43da2f-2046-1c4e-de36-f93f3408e2f4.png)


```java:Sida.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class Sida extends Frame {

    static final int SIDA_WIDTH = 500;
    static final int SIDA_HEIGHT = 500;
    static final Random rnd = new Random();
    static final BufferedImage buffImage
            = new BufferedImage(SIDA_WIDTH, SIDA_HEIGHT,
                    BufferedImage.TYPE_INT_BGR);
    static final Graphics2D graphics = buffImage.createGraphics();

    public static void main(String[] args) {
        //graphics.setBackground(Color.DARK_GRAY);
        graphics.setBackground(Color.BLACK);
        graphics.clearRect(0, 0, SIDA_WIDTH, SIDA_HEIGHT);
        f(20, 0, 0);
        new Sida();
    }

    public Sida() {
        super("Sida in Java");
        setSize(SIDA_WIDTH, SIDA_HEIGHT);
        addWindowListener(
                new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                }
        );
        this.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(buffImage, 0, 0, this);
    }

    static double W1x(double x, double y) {
        return 0.836 * x + 0.044 * y;
    }

    static double W1y(double x, double y) {
        return -0.044 * x + 0.836 * y + 0.169;
    }

    static double W2x(double x, double y) {
        return -0.141 * x + 0.302 * y;
    }

    static double W2y(double x, double y) {
        return 0.302 * x + 0.141 * y + 0.127;
    }

    static double W3x(double x, double y) {
        return 0.141 * x - 0.302 * y;
    }

    static double W3y(double x, double y) {
        return 0.302 * x + 0.141 * y + 0.169;
    }

    static double W4x(double x, double y) {
        return 0;
    }

    static double W4y(double x, double y) {
        return 0.175337 * y;
    }

    static void f(int k, double x, double y) {
        if (0 < k) {
            f(k - 1, W1x(x, y), W1y(x, y));
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W2x(x, y), W2y(x, y));
            }
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W3x(x, y), W3y(x, y));
            }
            if (rnd.nextDouble() < 0.3) {
                f(k - 1, W4x(x, y), W4y(x, y));
            }
        } else {
            plot((x * SIDA_WIDTH * 0.98) + (SIDA_WIDTH * 0.5),
                    SIDA_HEIGHT - (y * SIDA_HEIGHT * 0.98));
        }
    }

    static void plot(double xd, double yd) {
        int x = (int) xd;
        int y = (int) yd;
        graphics.setPaint(Color.green);
        graphics.drawLine(x, y, x, y);
    }
}
```

* 2014/06/03 [XSLとSVGで「プログラムでシダを描画する」](
http://ksmakoto.hatenadiary.com/entry/2014/06/03/005840)

* 2014/05/31 [「プログラムでシダを描画する」をCommon Lispで描画する](
https://gist.github.com/tkych/e34298b148dee455f3bf)

* 2014/05/30 [「プログラムでシダを描画する」をVue.jsで描画する(+α) - Qiita](
http://qiita.com/tekkoc/items/1ca56efc0a1c365a693f)

* 2014/05/30 [「プログラムでシダを描画する」を Purple で描画する - i2yの日記](
http://i2y.hatenablog.com/entry/2014/05/30/014502)

* 2014/05/29 [「プログラムでシダを描画する」をSass(CSS)で描画する - Qiita](
http://qiita.com/yaegaki/items/ec5c89e13d9fe61281ae)

* 2014/05/29 [「プログラムでシダを描画する」を Ruby で描画する - Qiita](
http://qiita.com/quanon86/items/d96cbea02800f97156e7)

* 2014/05/28 [「プログラムでシダを描画する」をEmacs Lispで描画する - Qiita](
http://qiita.com/akmiyoshi/items/ff4df934a5a89aaafbcb)

* 2014/05/27 [「プログラムでシダを描画する」をPHPで描画する - Qiita](
http://qiita.com/mpyw/items/dc339f12705f8b97ef67)

* 2014/05/27 [「プログラムでシダを描画する」をJavaScript+Canvasで描画する - Qiita](
http://qiita.com/alucky0707/items/ada6514d6068fdff2a8c)

* 2014/05/27 [「プログラムでシダを描画する」をPythonで描画する - Qiita](
http://qiita.com/noc06140728/items/8b8f06cfc312b8492df4)

* 2014/05/25 [Clojure - プログラムでシダを描画する - Qiita](
http://qiita.com/woxtu/items/30aebcf15770c438d6fd)

* 2014/05/24 [「プログラムでシダを描画する」をGoで描画する - Qiita](
http://qiita.com/qt-luigi/items/ec6cd349259fe6cc29eb)

* 2014/05/23 [「プログラムでシダを描画する」をDartで描画する - Qiita](
http://qiita.com/zukkun/items/08b72c9934d3c0c09936)

* 2014/05/05 [プログラムでシダを描画する - 強火で進め](
http://d.hatena.ne.jp/nakamura001/20140505/1399316565)

* 2013/12/27 [十進BASICでシダの葉プログラムを作ってみた（笑）](http://www.youtube.com/watch?v=KgvTw3aLacQ)