2007年5月4日金曜日

2次のBスプライン関数による曲線

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 1001
        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 - 42
            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 & $FFFFlparam >> 16

        redraw 0
        color : boxf
        color 255
        bsDrawPoint
        color 255255255
        bsDrawLine
        redraw
    } else {
        if iparam == 3 : bsClear
    }
    stop

0 件のコメント: