'*'で描画しよう(2) - わさっきの続きです.むしろ脱線.
(1)と(2)のプログラムは,行ごとに,空白を何個か出力してから,'*'を何個か出力する,という考え方をとっていました.
そうではなく,離散2次元平面の各点に,'*'か空白のいずれかを出力するという方針で,コードを作り直してみます.
#!/usr/bin/env ruby # diamond2.rb class Diamond def initialize(n_ = 0) @n = n_.to_i @n = 13 if @n <= 0 end def start nhalf = @n / 2 @n.times do |y| @n.times do |x| if (x - nhalf).abs + (y - nhalf).abs <= nhalf print "*" else print " " end end puts end end end if __FILE__ == $0 Diamond.new(ARGV.shift).start end
実行結果の前に,解説です.描きたいのは,数式で表現すると,となります.グラフで表すと次の通り.y軸は,画面描画に合わせて下向きにしています.
上のグラフの前に,のグラフを作っておくとわかりやすいかもしれません.このグラフを,x方向,y方向にそれぞれn/2ずつ移動すれば,期待する位置に打点できるというわけです.
さて実行結果.
$ ruby diamond2.rb * *** ***** ******* ********* *********** ************* *********** ********* ******* ***** *** *
よしよし.
$ ruby diamond2.rb 12 * *** ***** ******* ********* *********** ************ *********** ********* ******* ***** ***
あれあれ,これは美しくありません.
この修正は,次回に.