2次元配列を用いて内トロコイドを描きたい。
現在学校の課題で、2次元配列を用いて図形を描けという課題が出て、私は内トロコイド(ハイポトロコイド)を描こうとし、下記のコードを書いたのですがいまいち上手に書けません。間違っているところがあれば教えてくれると幸いです。コード内のpsetはある座標に色を塗るメソッドで、hypotrochoidメソッドが内トロコイドを描くメソッドになっています。
以下の式が内トロコイドの式になります。
発生している問題・エラーメッセージ
psetメソッドが「Y 座標が大きいほど下」に点を打つようになっており、「Y 座標が大きいほど上」に点を打つようになっていないため、混乱しています。
該当のソースコード
Ruby
1Pixel = Struct.new(:r, :g, :b) 2$img = Array.new(300) do 3 Array.new(300) do Pixel.new(255,255,255) end 4end 5def pset(x, y, r, g, b, a = 0.0) #ある座標に点を打つ 原点中心にする必要あり!! 6 if x < 0 || x >= 300 || y < 0 || y >= 300 then return end 7 $img[y][x].r = ($img[y][x].r * a + r * (1.0 - a)).to_i 8 $img[y][x].g = ($img[y][x].g * a + g * (1.0 - a)).to_i 9 $img[y][x].b = ($img[y][x].b * a + b * (1.0 - a)).to_i 10end 11 12def hypotrochoid(rc,rm,rd,r,g,b,a=0.0) 13 0.step(360) do |theta| 14 pset(Math.cos(theta / 180.0 * Math::PI) * (rc-rm) + rd * Math.cos((rc-rm)/rm * theta / 180.0 * Math::PI), 15 Math.sin(theta / 180.0 * Math::PI) * (rc-rm) - rd * Math.sin((rc-rm)/rm * theta / 180.0 * Math::PI), 16 r,g,b,a) 17 end 18end 19 20def writeimage(name) 21 open(name, "wb") do |f| 22 f.puts("P6\n300 200\n255") 23 $img.each do |a| 24 a.each do |p| f.write(p.to_a.pack("ccc")) end 25 end 26 end 27end 28 29def mypicture 30 hypotrochoid(180,130,250,0,0,0) 31 writeimage("t.ppm") 32end 33
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。