とある友人の今夏の目標の一つは「カオスの画像をコンピュータで描画する」らしい.
おもしろそうなのでやってみた.その友人は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倍.
ppmのままだと半端無く重いのでGIMP使って.ppm→.bmpへ,Vix使って.bmp→.pngに変換した.
VBで言うところの“PictureBox”的なものがあれば楽なんだが, Rubyのグラフィックライブラリ全く知らないし,調べるので時間取られるのもやだなぁ,と. 北大の情報の授業で使われてたテキストだとTcl/Tk使ってるけど,Tcl/Tkも全くしらん. 結局,出力が楽なppmで描いた.
ただ,ppmを表示出来るものをGIMP以外に知らない.っていうかちゃんと調べてない.
誰か,“ppm viewer的な何か”ご存じの方,いらっしゃいませんか?出来れば軽い奴.
追記:GIMP重い.
