2次のBスプライン関数を描画する。// 2次のBスプライン関数 for HSP3
#module BSpline
// 2次のBスプライン関数を描画
// (x1, y1)と(x3, y3)がオンカーブ点、(x2, y2)がオフカーブ点
#deffunc bsArgo int x1, int y1, int x2, int y2, int x3, int y3, local k, local t
pos x1, y1
repeat 100, 1
t = double(cnt)/100
k = 1.0 - t
line k * k * x1 + 2.0 * t * k * x2 + t * t * x3, k * k * y1 + 2.0 * t * k * y2 + t * t * y3
loop
return
// オンカーブ点を算出し、bsArgoへ渡す
#deffunc bsDrawLine local xCurrent, local yCurrent
if count > 3 {
bsArgo x(0), y(0), x(1), y(1), (x(1) + x(2))/2, (y(1) + y(2))/2
xCurrent = (x(1) + x(2))/2 : yCurrent = (y(1) + y(2))/2
repeat count - 4, 2
xNext = (x(cnt) + x(cnt + 1))/2 : yNext = (y(cnt) + y(cnt + 1))/2
bsArgo xCurrent, yCurrent, x(cnt), y(cnt), xNext, yNext
xCurrent = xNext : yCurrent = yNext
loop
bsArgo xCurrent, yCurrent, x(count - 2), y(count - 2), x(count - 1), y(count - 1)
} else {
if count == 3 : bsArgo x(0), y(0), x(1), y(1), x(2), y(2)
}
return
// 点を描画
#deffunc bsDrawPoint
repeat count
circle x(cnt) - 2, y(cnt) - 2, x(cnt) + 2, y(cnt) + 2
loop
return
// 点を追加 最初と最後がオンカーブ点、それ以外はオフカーブ点になる
#deffunc bsAdd int x1, int y1
x(count) = x1 : y(count) = y1
count++
return count
#deffunc bsClear
count = 0
dim x, 1 : dim y, 1
cls 4
return
#global
bsClear
onclick *addPoint
stop
// 左クリックで制御点を追加、右クリックで制御点を削除
*addPoint
if iparam == 0 {
bsAdd lparam & $FFFF, lparam >> 16
redraw 0
color : boxf
color 255
bsDrawPoint
color 255, 255, 255
bsDrawLine
redraw
} else {
if iparam == 3 : bsClear
}
stop
2007年5月4日金曜日
2次のBスプライン関数による曲線
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿