HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0418
Shinya係数決定4解決


Shinya

リンク

2007/4/18(Wed) 19:56:39|NO.7569

 いくつかのウェブサイトではBスプライン関数の係数の決定は以下のようになっています。

http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node16.html
http://www5d.biglobe.ne.jp/~stssk/maze/spline.html
http://www.f-kmr.com/numana/spline.pdf#search='B%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E9%96%A2%E6%95%B0'

 一方で、Bスプライン関数の係数を場合分けによって決定するものが公開されています。(次数が決まれば係数が決まるとか...)
しかし、いったいなぜこのような場合分けと係数になるのでしょうか、素直に未知数を消していけば出てくるのですか?
よくわからないので教えてください。以下は場合分けの方法です。
; ################################################################
; TYPE MACRO #define NULL 0 ; DATA MACRO #const DIM_MAX 10 #const End_Point DIM_MAX-1 ; ################################################################ ; DATA count = 0 // mouse(x, y) musx = 0 musy = 0 ; ################################################################ ; CODE screen 0, ginfo_dispx, ginfo_dispy, 0, 0, 0 mes "" + DIM_MAX + " この座標を決めてください" repeat stick k, NULL, 1 : if k != 256 { wait 1 : continue } musx(count) = mousex musy(count) = mousey count++ repeat count boxf musx(cnt)-5, musy(cnt)-5, musx(cnt)+4, musy(cnt)+4 loop if count == DIM_MAX { break } loop gosub *MainObjDraw ; ################################################################ stop ; ################################################################ ; CODE(SUB) ; ---------------------------------------------------------------- *MainObjDraw ; ---------------------------------------------------------------- div = 0.0002 * DIM_MAX t = -1.0 repeat if t >= DIM_MAX : break x = 0.0 y = 0.0 j = -2 repeat if j > DIM_MAX+1 : break k = j if j < 0 : k = 0 if j > End_Point : k = End_Point tt = t - j if tt < 0.0 : tt = -tt if tt < 1.0 { a = (3.0 * tt * tt * tt -6.0 * tt * tt + 4.0) / 6.0 } else : if(tt < 2.0) { a = tt - 2.0 a = -a * a * a / 6.0 } else : a = 0.0 x + a * musx(k) y + a * musy(k) j++ loop t + div pset x, y loop return ; ################################################################



この記事に返信する


naznyark

リンク

2007/4/20(Fri) 01:35:45|NO.7598

このスクリプトで描画されるのはBスプライン曲線ではなく
ベジェ曲線なのではないのかと思いますが・・・。



eller

リンク

2007/4/20(Fri) 07:33:05|NO.7599

Googleにて「Bスプライン曲線」で検索すると、
方程式の決定について詳しく解説されたサイトが見つかりますよ。


> 次数が決まれば係数が決まる
「n次曲線方程式の係数は(n + 1)個の条件で決定される」という意味でしょうか?
それでしたら、数学で常識とされているようなことなのでそういうものだと覚えてしまうのが早いです。
自信はありませんが、因数分解などを勉強されると理解できるのではないかと思います。

なお余談ですが、
k = j
if j < 0 : k = 0 if j > End_Point : k = End_Point
はlimit関数で簡略化できるはずです。便利な関数なので、ぜひ試してみてください。



Shinya

リンク

2007/4/20(Fri) 22:02:49|NO.7613

naznyarkさん ellerさん返事ありがとうございます。

>このスクリプトで描画されるのはBスプライン曲線ではなく
>ベジェ曲線なのではないのかと思いますが・・・。

 う〜ん、よく分かりません。でもベジェの媒介変数の区間は (0, 1) だったような...。

僕は、Bスプライン関数は↓のようなものだと思いましたが、NO.7569 のプログラムはたったの3通りの場合分けでいろいろな滑らか曲線を表現しているので、ちょっと気になっただけです。
重み関数とか、また違った要素があるのかな。
	x = 0.0
y = 0.0 d = 100.0 repeat 640.0*d // 多項式を重ねる if 0.0<=x and x<=3.0 { y = -2.0*x*x*x + 3.0*x*x + 19.0*x + 26.0 } else : if 3.0<=x and x<=4.0 { y = 5.0*x*x*x -60.0*x*x + 208.0*x - 163.0 } else : if 4.0 <= x { y = -32.0*x + 157.0 } x + 1.0/d pset x*d, y + ginfo_winy/2 loop
自分でもベジェ曲線、Bスプラインについて調べますので何か分かったら報告します。



Shinya

リンク

2007/5/3(Thu) 17:10:26|NO.7958

↓の【スプライン関数】ってとこ見てたらひらめいたのでサンプって見ました。
http://www.geocities.jp/ikuro_kotaro/koramu/henbun.htm
	K = 1.5
m = 1.5 xx = 200.0, 300.0, 300.0 yy = 200.0, 300.0, 200.0 repeat length(xx) boxf xx(cnt)-5, yy(cnt)-5, xx(cnt)+4, yy(cnt)+4 loop color 255 c = 0.0 x = xx y = yy repeat 1000 x = K*(xx(1) - x)*c*c/m/2 + x y = K*(yy(1) - y)*c*c/m/2 + y c + 0.001 boxf x-3, y-3, x+2, y+2 loop // 補間値 ux = k/m * (xx(1) - xx(0))/300 uy = k/m * (yy(1) - yy(0))/300 c = 0.0 x = xx(1) y = yy(1) repeat 1000 x = K*(xx(2) - x)*c*c/m/2 + x + ux y = K*(yy(2) - y)*c*c/m/2 + y + uy c + 0.001 boxf x-3, y-3, x+2, y+2 loop
断然、曲関数のほうが見た目が良いのですが、曲がったことに感動・・・。



ONION software Copyright 1997-2023(c) All rights reserved.