紅孔雀 このページをアンテナに追加 RSSフィード

2007-01-01 シェルピンスキーの三角形を生成するアルゴリズム

[] シェルピンスキーの三角形を生成するアルゴリズム

Google のイメージ検索で「Fractal Art」などをキーワードに検索すると、幻想的なフラクタル画像を見つけることができます。フラクタルといえばシェルピンスキーの三角形が最も有名ですが、実はシェルピンスキーの三角形は非常に単純な規則で生成することができます:


for(y = 0; y < height; y++)
    for(x = 0; x < width; x++)
        if((x & y) == 0)
            plot(x, y)

「x と y の bitwise-and が 0 ならば点を打つ」という単純なアルゴリズムです。これを Java のプログラムに書き直すと以下のようになります:

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

class SierpinskiTriangleMain
{
    public static void main(String[] arguments) throws Exception
    {
        // 生成する画像のサイズ. 2 の冪乗数にするとちょうどよい.
        int width  = 256;
        int height = 256;

        BufferedImage image =
            new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for(int y = 0; y < height; y++)
            for(int x = 0; x < width; x++)
                image.setRGB(x, y, ((x & y) | (x & y) + 0x7FFFFFFF) >> 31);

        ImageIO.write(image, "PNG", new File("image.png"));
    }
}

BufferedImage に画像を作成し、ImageIO で PNG ファイルとして保存しています。ループの一番内側、image.setRGB の第三引数は (x & y) の値が 0 か 0 以外かによって 0x00000000(黒)または 0xFFFFFFFF(白)となります。((x & y) | (x & y) + 0x7FFFFF) の値を C とすると、C の最上位ビットは (x & y) が 0 以外の場合に 1、0 の場合に 0 となります。それを右に 31-bit 算術シフトすることで、0x00000000 または 0xFFFFFFFF となります。このプログラムを実行すると以下の画像が得られます:

f:id:benikujyaku:20070101225640p:image

ちなみに Java SE 6 "Mustang" の ImageIO は GIF 形式での出力に対応しています。