2007年5月5日土曜日

ベジェ曲線

ベジェ曲線を描画する。
2つ目以降のベジェ曲線は、1つ前のベジェ曲線の終点を始点とする。

参考

  • http://musashi.or.tv/fontguide_doc3.htm

// 3次のベジェ曲線 for HSP3

#module Bezier
// 3次のベジェ曲線を描画
// (x1, y1)と(x4, y4)が端点、(x2, y2)と(x3, y3)が方向点
#deffunc bzArgo int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, local t, local k, local lx, local ly
    pos x1, y1
    repeat 1001
        t = double(cnt)/100
        k = 1.0 - t
        lx = k * k * k * x1 + 3.0 * k * k * t * x2 + 3.0 * k * t * t * x3 + t * t * t * x4
        ly = k * k * k * y1 + 3.0 * k * k * t * y2 + 3.0 * k * t * t * y3 + t * t * t * y4
        line lx, ly
    loop
    return

// 制御点を4つづつ区切り、bzArgoに渡す
#deffunc bzDrawLine
    repeat (count - 1)/3
        bzArgo x(cnt*3), y(cnt*3), x(cnt*3 + 1), y(cnt*3 + 1), x(cnt*3 + 2), y(cnt*3 + 2), x(cnt*3 + 3), y(cnt*3 + 3)
    loop
    return

// 点を描画
#deffunc bzDrawPoint
    repeat count
        circle x(cnt) - 2, y(cnt) - 2, x(cnt) + 2, y(cnt) + 2
    loop
    return

// 点を追加
#deffunc bzAdd int x1, int y1
    x(count) = x1 : y(count) = y1
    count++
    return count

#deffunc bzClear
    count = 0
    dim x, 1 : dim y, 1
    cls 4
    return
#global

    bzClear
    onclick *addPoint
    stop

// 左クリックで制御点を追加、右クリックで制御点を削除
*addPoint
    if iparam == 0 {
        bzAdd lparam & $FFFFlparam >> 16

        redraw 0
        color : boxf
        color 255
        bzDrawPoint
        color 255255255
        bzDrawLine
        redraw
    } else {
        if iparam == 3 : bzClear
    }
    stop

0 件のコメント: