to site top page

Ruby Programing : Chaos Map[加筆修正:2008/11/6]

とある友人の今夏の目標の一つは「カオスの画像をコンピュータで描画する」らしい.

おもしろそうなのでやってみた.その友人はCかC++を使うっぽいので私はRubyで.

cp = File.open('plot.ppm', 'w')

feed = [1,0]
diam = 50
pnum = 100000
map = []
mapbuf = []

x = feed[0]
y = feed[1]

fmx = fpx = x
fmy = fpy = y

for n in 1..pnum
    cx = y - 0.97 * x + 4 / (1 + x*x) - 3
    cy = -0.98 * x

    if cx <= fmx
        fmx = cx
    elsif cx >= fpx
        fpx = cx
    end
    if cy <= fmy
        fmy = cy
    elsif cy >= fpy
        fpy = cy
    end

    x = cx
    y = cy
end

width = ((fpx - fmx) * diam).round + 1
height = ((fpy - fmy) * diam).round + 1
for axisy in 1..height
    for axisx in 1..width
        mapbuf << 0
    end
    map << mapbuf
    mapbuf = []
end

x = feed[0]
y = feed[1]

for n in 1..pnum
    cx = y - 0.97 * x + 4 / (1 + x*x) - 3
    cy = -0.98 * x
    map[((cy - fmy) * diam).round][((cx - fmx) * diam).round] = 1
    x = cx
    y = cy
end

cp.print("P3\\n", width, " ", height, "\\n", 255, "\\n")

for axisy in 1..height
    for axisx in 1..width
        if map[axisy - 1][axisx - 1] == 0
            cp.print(255, " ", 255, " ", 255, "\\n")
        else
            cp.print(68, " ", 102, " ", 221, "\\n")
        end
    end
end

cp.close

途中までBitmapで出力するつもりだったが,データ構造調べるの面倒になったのでppmで出力.以下のもの.10万点分プロット.拡大率50倍.

Chaos Plot Picture

ppmのままだと半端無く重いのでGIMP使って.ppm→.bmpへ,Vix使って.bmp→.pngに変換した.

VBで言うところの“PictureBox”的なものがあれば楽なんだが, Rubyのグラフィックライブラリ全く知らないし,調べるので時間取られるのもやだなぁ,と. 北大の情報の授業で使われてたテキストだとTcl/Tk使ってるけど,Tcl/Tkも全くしらん. 結局,出力が楽なppmで描いた.

ただ,ppmを表示出来るものをGIMP以外に知らない.っていうかちゃんと調べてない.

誰か,“ppm viewer的な何か”ご存じの方,いらっしゃいませんか?出来れば軽い奴.

追記:GIMP重い.

can't load my result

前後の記事

最近の記事(5件分)

する事

そのうち記事にするかもリスト

欲しい本