仮想計算機構

IT業界と無縁な派遣社員のブログ

線を丁寧に描くよ

以前の記事*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)
(gr_BMP "test.bmp")

 main.scmの実行後、同じディレクトリ配下にtest.bmpができます。

確認してみましょう。

f:id:riverta1992:20200429215234j:plain

 はい。

ブレブレな線ですが、線は線です。思えばなんと地味なことをやっているのでしょう。確かきれいに線を描くアルゴリズムもあったと思いますが、それはまた余裕のあるときに実装してみたいと思います。

 

参考文献