ブレゼンハム直線描画その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 22:04
nice!(0)
コメント(0)
トラックバック(0)
コメント 0