ベジェ曲線を描画する。
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 100, 1
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 & $FFFF, lparam >> 16
redraw 0
color : boxf
color 255
bzDrawPoint
color 255, 255, 255
bzDrawLine
redraw
} else {
if iparam == 3 : bzClear
}
stop
0 件のコメント:
コメントを投稿