to site top page

Ruby Programing : Chaos Map2

前回の続きですが前回が9ヶ月も前です.なんぞこれ.mathの方でアップしましたが殆どRubyの話です.

改めてコードを見直したら結構,あれだ,素人くさかったので,ちょっと書き換えた.

feed = [1, 0]
param = [50, 100000]
point_x = []
point_y = []
x = feed[0]
y = feed[1]

param[1].times {
  point_x << (x * param[0]).round
  point_y << (y * param[0]).round

  cx = y - 0.97 * x + 4 / (1 + x * x) - 3
  cy = -0.98 * x

  x = cx
  y = cy
}

x_l = point_x.min
y_l = point_y.min

width = point_x.max - x_l + 1
height = point_y.max - y_l + 1

drw = Array.new(height){Array.new(width){0}}
param[1].times {|i| drw[point_y[i] - y_l][point_x[i] - x_l] = 1 }

cp = File.open('plot.ppm', 'w')
cp.print("P3\\n", width, " ", height, "\\n", 255, "\\n")
height.times {|axy|
  width.times {|axx|
    cp.print(255, " ", 255, " ", 255, "\\n") if drw[axy][axx] == 0
    cp.print(68, " ", 102, " ", 221, "\\n") if drw[axy][axx] == 1
  }
}
cp.close

前に書いたのが去年の8月か,当時はイテレータのイの字も知らずタダfor文でぶん回してたのをちゃんとイテレータ使ってみた.使えてるかどうかは知らない.

で,2時間程度延々悩み続けたのがdrwの初期化.

drw = Array.new(height, Array.new(width,0))

こう書いてプログラム実行したら,はき出された画像は真っ青.ドラえもんより真っ青.某タヌキロボより真っ青.

1時間くらい悩んだ所で,[x, y]の点数(10万点)に対してのプロット数(概算70万点)が多すぎる事に思い至った.

ここら辺でさっぱりわからなくなって二次元配列で検索したら便所さん所引っかかって,見たら

irb(main):002:0> mat1[0][0]=1
=> 1
irb(main):003:0> mat1
=> [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

[0][0]に代入で[n][0]が全部変わってる.調べた.

Array.new([size[, val]])

初期値 val は、そのコピーで初期化するわけではないことに注意してください。以下のようにすべての要素は同じオブジェクトを指します。

要するに,ポインタって事ですかね?drw = Array.new(height, Array.new(width, 0))と書くとdrw[n]に与えられるのは各々生成されたArray.new(width,0)ではなく,どこぞに生成されたArray.new(width,0)のポインタなんですかね?

そろそろReference的な書籍を買わないといけないな,うん.

can't load my result

前後の記事

最近の記事(5件分)

する事

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

欲しい本