わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

'*'で描画しよう(3)

'*'で描画しよう(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

実行結果の前に,解説です.描きたいのは,数式で表現すると,|x-n/2|+|y-n/2|\leq n/2となります.グラフで表すと次の通り.y軸は,画面描画に合わせて下向きにしています.

上のグラフの前に,|x|+|y|\leq n/2のグラフを作っておくとわかりやすいかもしれません.このグラフを,x方向,y方向にそれぞれn/2ずつ移動すれば,期待する位置に打点できるというわけです.

さて実行結果.

$ ruby diamond2.rb
      *      
     ***     
    *****    
   *******   
  *********  
 *********** 
*************
 *********** 
  *********  
   *******   
    *****    
     ***     
      *      

よしよし.

$ ruby diamond2.rb 12
      *     
     ***    
    *****   
   *******  
  ********* 
 ***********
************
 ***********
  ********* 
   *******  
    *****   
     ***    

あれあれ,これは美しくありません.
この修正は,次回に.