グラデーションを描画するサンプルスクリプト

任意の方向にグラデーションを描画するサンプルスクリプトです。1 ピクセルずつ pset 命令で描画する方法ですが、それなりに高速化のために工夫しています。モジュールにしたいところですが、どうにも引数が多くなるものですからどういう指定方法にすべきか考えてます。

ToyWiki - ToyWiki - 線分と点の距離の線分と点の距離を求めるアルゴリズムを参考にしました。

#uselib "winmm"
#cfunc timeGetTime "timeGetTime"

screen 0, 256, 256

// 描画する範囲を設定
x = 10
y = 10
w = ginfo_sx - 20
h = ginfo_sy - 20

// グラデーションの向きや大きさを決める線分の座標
randomize
x0 = double( x + rnd( w ) )
y0 = double( y + rnd( h ) )
x1 = double( x + rnd( w ) )
y1 = double( y + rnd( h ) )

dx = x1 - x0
dy = y1 - y0
a = dx * dx + dy * dy
b = dx * ( x0 - x ) + dy * ( y0 - y )
if a != 0.0 {
    t = - ( b / a )
    ddx = dx / a
    ddy = dy / a
} else {    // (x0,y0)-(x1,y1)が線分でなく点の場合
    t = 0.5
    ddx = 0.0
    ddy = 0.0
}

redraw 0
__l = t
repeat h
    ycnt = cnt
    __l += ddy
    _l = __l
    repeat w
        xcnt = cnt
        _l += ddx
        l = int( limitf( _l, 0.0, 1.0 ) * 255 )
        color l, l, l
        pset xcnt + x, ycnt + y
    loop
loop
color 255, 0, 0
line x1, y1, x0, y0
redraw 1

同じ色が続くところは line で処理するなど、まだ高速化の余地はありますね。

インフォメーション

公開日時
2007年7月25日 午前10時11分28秒
最終更新日時
2007年9月9日 午後6時33分4秒
カテゴリ
HSP