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


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

Java (AWT)バージョンに続いて、Java で PNG を生成するバージョンを書いてみました。
実行すると、カレントディレクトリ(カレントフォルダ)に sida.png というファイルが生成されます。
(バグとかご意見ありましたら https://twitter.com/akmiyoshi までお願いします)

Sida.java
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Random;
import javax.imageio.ImageIO;

public class Sida {

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

    public static void main(String[] args) {
        graphics.setBackground(Color.DARK_GRAY);
        graphics.clearRect(0, 0, WIDTH, HEIGHT);
        f(20, 0, 0);
        try {
            ImageIO.write(buffImage, "png", new File("sida.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    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 * WIDTH * 0.98) + (WIDTH * 0.5), HEIGHT - (y * 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);
    }
}