わさっきhb

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

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

'*'で描画しよう(3) - わさっきの続きでございます.
前回残した課題は,nすなわちダイアモンド型の対角線の長さとして偶数を与えたときに,ダイアモンド型になってくれないというものでした.偶数だったら「とんがらせる」ことができないので,ダイアモンド型を追求するのが無茶じゃないか,と思うことなく,次善の解を考えていきます.
n=8のとき,描きたい図形を座標で表してみます.

この図で,'*'に着目すると,左端の'*'の表示する上でのx座標は0になります.そう考えたときに,図の中心の座標は,実数軸で見ると(\frac{n}{2},\frac{n}{2})なのですが,左端の'*'を0として,いわば離散的に考えると,(\frac{n-1}{2},\frac{n-1}{2})となります.この中心座標は,nが奇数のときにも成り立ちます.
ということで,プログラムは次のようになります.

#!/usr/bin/env ruby

# diamond3.rb

class Diamond
  def initialize(n_ = 0)
    @n = n_.to_i
    @n = 13 if @n <= 0
  end

  def start
    nhalf = @n / 2
    dist = (@n - 1.0) / 2
    @n.times do |y|
      @n.times do |x|
        if (x - dist).abs + (y - dist).abs <= nhalf
          print "*"
        else
          print " "
        end
      end
      puts
    end
  end
end

if __FILE__ == $0
  Diamond.new(ARGV.shift).start
end

実行してみます.

$ ruby diamond3.rb
      *      
     ***     
    *****    
   *******   
  *********  
 *********** 
*************
 *********** 
  *********  
   *******   
    *****    
     ***     
      *      
$ ruby diamond3.rb 12
     **     
    ****    
   ******   
  ********  
 ********** 
************
************
 ********** 
  ********  
   ******   
    ****    
     **     

(2)の図形と少し違います.あっちでは,n-1行n列の領域に描いていました.今回のほうが,左右対称,上下対称,そして点対称ですので,均整がとれています.脱線ではなくこちらを本線として,次回はこれをCに作り替えることにします.

追記: 図を変更

nが奇数の場合,偶数の場合のそれぞれで,0がX軸・Y軸に乗るように,図を作り直してみました.