SSブログ

ブレゼンハム直線描画その2(Ruby/SDL)


前回適当にRubyで遊んだブレゼンハムの線描画関数を汎用的に作ってみた。
せっかくのRubyなので、ブロック(yield)機能を使って、アルゴリズムと描画機能を分離してみた。

いやあRubyのブロック機能はまあCのプリプロセッサ(マクロ)みたいなもんだな。
あと、変数の代入文をx,y = a,b みたいに記述できるって、すばらしいね。直感的。


require 'sdl'

def b_draw_line(x0,y0,x1,y1)
  dx = (x1-x0).abs
  dy = (y1-y0).abs

  if x1>=x0 then
    x_s, x_e = x0, x1
  else
    x_s, x_e = x1, x0
  end
  if y1>=y0 then
    y_s, y_e = y0, y1
  else
    y_s ,y_e = y1, y0
  end

  px, py = x_s, y_s
  if(dx>=dy) then
      e = dx
      loop do
        yield(px,py)
        px += 1
        e += 2*dy
        if(e >= 2*dx) then
          e -= 2*dx
          py += 1
        end
        if(px>=x_e) then break end
      end
    else
      e = dy
      loop do
        yield(px,py)
        py += 1
        e += 2*dx
        if(e >= 2*dy) then
          e -= 2*dy
          px += 1
        end
        if(py>=y_e) then break end
      end
    end
end

SDL.init( SDL::INIT_VIDEO )
screen = SDL.setVideoMode(640, 480, 16, SDL::SWSURFACE )

b_draw_line(100,100,400,200) {|x,y| screen.put_pixel(x,y,[255,255,255]) }

b_draw_line(600,300,400,200) {|x,y| screen.put_pixel(x,y,[255,100,255]) }

screen.updateRect(0,0,0,0)

loop do
     while event = SDL::Event2.poll
     case event
     when SDL::Event2::Quit, SDL::Event2::KeyDown
          exit
     end
   end
end



スクリーンショット(2013-09-07 21.52.50).png



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。