以前の記事*1で作成したgrBMP.scmを使って線を描いてみます。以前作ったプログラムだけでは真っ黒な画像しか作れないので、線を描画するためのプログラムline.scmを準備しました。例によってこちらも奥村本 (p.65) のC言語のコードをSchemeに書き換えたものになります。
#| line.scm |#
(define (gr_line x1 y1 x2 y2 color)
(define dx (abs (- x2 x1)))
(define dy (abs (- y2 y1)))
(define step 0)
(define s 0)
(if (> dx dy)
(begin
(if (> x1 x2)
(begin
(set! step (if (> y1 y2) 1 -1))
(set! s x1)
(set! x1 x2)
(set! x2 s)
(set! y1 y2)
)
(set! step (if (< y1 y2) 1 -1))
)
(gr_dot x1 y1 color)
(set! s (arithmetic-shift dx -1))
(do
#| update |#
([i 0 (+ i 1)])
#| condition |#
([>= (+ x1 i) x2] )
#| body |#
(begin
(set! s (- s dy))
(if (< s 0)
(begin (set! s (+ s dx)) (set! y1 (+ y1 step)))
)
(gr_dot (+ x1 i) y1 color)
)
)
)
(begin
(if (> y1 y2)
(begin
(set! step (if (> x1 x2) 1 -1))
(set! s y1)
(set! y1 y2)
(set! y2 s)
(set! x1 x2)
)
(set! step (if (< x1 x2) 1 -1))
)
(gr_dot x1 y1 color)
(set! s (arithmetic-shift dy -1))
(do
#| update |#
([i 0 (+ i 1)])
#| condition |#
([>= (+ y1 i) y2] )
#| body |#
(begin
(set! s (- s dx))
(if (< s 0)
(begin (set! s (+ s dy)) (set! x1 (+ x1 step)))
)
(gr_dot x1 (+ y1 i) color)
)
)
)
)
)
ではさっそく以下のプログラムで斜めの線を描いてみます。
#| main.scm |#
(include "grBMP.scm")
(include "line.scm")
(gr_line 20 20 200 300 WHITE)
main.scmの実行後、同じディレクトリ配下にtest.bmpができます。
確認してみましょう。
はい。
ブレブレな線ですが、線は線です。思えばなんと地味なことをやっているのでしょう。確かきれいに線を描くアルゴリズムもあったと思いますが、それはまた余裕のあるときに実装してみたいと思います。