任意の方向にグラデーションを描画するサンプルスクリプトです。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 で処理するなど、まだ高速化の余地はありますね。