B-スプライン曲線のソースを表示
←
B-スプライン曲線
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
[[File:B-spline_curve.svg|thumb|B-スプライン曲線と制御点の例]] {{読み仮名|'''B-スプライン曲線'''|Bスプラインきょくせん|{{lang-en-short|B-spline curve}}}}は、与えられた複数の制御点と[[B-スプライン曲線#ノット|ノット]]から定義される滑らかな[[曲線]]である。 [[区分的|区分]][[多項式]]により表現されているため、一部を変更しても曲線全体に影響は及ばない等の性質がある。[[ベジェ曲線]]とともに、[[コンピュータグラフィックス]]の世界で広く利用されている。なお、B-splineはBasis spline(Basis=基底)の省略形である。曲線は必ずしも制御点を通らない。 == 定義 == パラメータ <math>t \in \Bbb{R}</math> 上に <math>m</math> 個の値 <math>\{ t_j \in \Bbb{R} \ | \ t_j \leq t_{j+1}, \ j \in \{0, 1, ..., m-1 \} \} </math>([[B-スプライン曲線#ノット|ノット]])をとり、次数を <math>n \in \Bbb{N}</math> とする。 制御点を <math>\mathbf{P}_{i}, \ 0 \leq i \leq m-n-2 </math> とすると、<math>n</math> 次の B-スプライン曲線 <math>\mathbf{S}(t)</math> は以下で定義される: :<math>\mathbf{S}(t)= \sum_{i=0}^{m-n-2} \mathbf{P}_{i} b_{i,n}(t)\ \text{,}\qquad t \in [t_n,t_{m-n-1}]</math>. このとき <math>b_{i,n}(t)</math> は {{読み仮名|'''B-スプライン基底関数'''|Bスプラインきていかんすう|{{lang-en-short|B-spline basis function}}}}と呼ばれ、'''de Boor Coxの漸化式''' によって次のように定義される。 :<math>b_{j,0}(t) := \left\{ \begin{matrix} 1 & \text{if} \quad t_j \leq t < t_{j+1} \\ 0 & \text{otherwise} \end{matrix} \right.,\qquad j=0,\ldots, m{-}2 </math> :<math>b_{j,k}(t) := \frac{t - t_j}{t_{j+k} - t_j} b_{j,k-1}(t) + \frac{t_{j+k+1} - t}{t_{j+k+1} - t_{j+1}} b_{j+1,k-1}(t) ,\qquad j=0,\ldots, m{-}k{-}2.</math> == ベジェ曲線との関係性 == n次B-スプライン曲線は、以下のように制限するとn次[[ベジェ曲線]]と同一の式になる。つまりベジェ曲線はB-スプライン曲線の特殊な場合である。 * 制御点の数は <math>n + 1</math> 個。よってノットの数は <math>m= 2(n + 1)</math> 個。 * t が 0 から 1 まで変化するとし、ノットは <math>t_j = 0\ \mbox{for}\ j \le n</math> および <math>t_j = 1\ \mbox{for}\ j > n</math> 。 == ノット == B-スプラインにおける'''ノット'''({{lang-en-short|knot}})はパラメータ <math>t</math> の値であって、セグメントの区切りを定めるものである<ref>"セグメントの区切りとなるパラメータの値を定義した数値(ノット)" {{Harvnb|三谷|2020}} より引用。</ref>。 ノットの範囲は <math>t_0 = 0, t_{m-1} = 1</math> とすることが多い<ref>[http://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-basis.html B-spline Basis Functions: Definition - CS3621 Introduction to Computing with Geometry Notes]</ref>。 === ノットベクトル === '''ノットベクトル'''({{lang-en-short|knot vector}})は昇順に並べられたノットの列である<ref>"ノットベクトル ... ノット ... の列" {{Harvnb|三谷|2020}} より引用。</ref><ref>"Bスプラインの形を決めるもの ... ノット列の値は単純増加" {{Harvnb|三谷|2020}} より引用。</ref>。 ノットベクトルはいくつかの種類にわけられる。以下はその一例である: * [[B-スプライン曲線#一様ノットベクトル|一様ノットベクトル]] * [[B-スプライン曲線#開一様ノットベクトル|開一様ノットベクトル]] * [[B-スプライン曲線#非一様ノットベクトル|非一様ノットベクトル]] ==== 一様ノットベクトル ==== {{読み仮名|'''一様ノットベクトル'''|いちようノットベクトル|{{lang-en-short|uniform knot vector}}}}はノットが等間隔に配置されたノットベクトルである<ref>"ノットベクトル ti が一定の間隔で存在する → 一様" {{Harvnb|三谷|2020}} より引用。</ref><ref name=":0">"ノットベクトルには、次の3つの型がある。... ノットベクトルが等差数列になっている場合の一様なノットベクトル(uniform knot vector)" {{Harvnb|谷口|2000|p=241}} より引用。</ref>。 <math>m</math> 個のノットからなる一様ノットベクトルは <math>j</math> 番目の要素 <math>t_j, \ j \in \{0, ..., m-1\} </math> が以下のように定義される<ref name="node4-agraphhci">[https://www.cl.cam.ac.uk/teaching/1999/AGraphHCI/SMAG/node4.html B-splines - Advanced Graphics and HCI]</ref>: : <math>t_j = t_0 + \frac{t_{m-1} - t_0}{m - 1} j</math> 言い換えれば、要素が[[等差数列]]状に並んでいるノットベクトルが一様ノットベクトルである<ref name=":0" />。 ==== 開一様ノットベクトル ==== {{読み仮名|'''開一様ノットベクトル'''|かいいちようノットベクトル|{{lang-en-short|open uniform knot vector}}}}はベクトルの両端がそれぞれB-スプラインの次数だけ重複しているノットベクトルである<ref>"ノットベクトルには、次の3つの型がある。...ノットベクトルが両端で階数だけ重複している場合の開一様ノットベクトル(open uniform)" {{Harvnb|三谷|2020}} より引用。</ref><ref name="node4-agraphhci" />。{{読み仮名|'''一様間隔ノットベクトル'''|いちようかんかくノットベクトル|{{lang-en-short|uniformly-spaced knot vector}}}}とも<ref name="PARA-knot-generation" /><ref>[http://demonstrations.wolfram.com/KnotVectorGenerationForBSplineInterpolation/ Knot Vector Generation for B-Spline Interpolation - Wolfram Demonstrations Project]</ref>。 開一様ノットベクトルは次の手順で作られる: * 最初の <math>n + 1</math> 個は 0 とする。 * 最後の <math>n + 1</math> 個は 1 とする。 * 残りの <math>m - 2 (n + 1)</math> 個は 0 より大きく 1 より小さい値で均等間隔で埋める。 例えば、n = 2, m = 7 の場合は制御点は4個でノットベクトルは <math>[0\ 0\ 0\ 0.5\ 1\ 1\ 1]</math> である。このノットベクトルの作り方では、曲線の端点は最初と最後の制御点になる。また、制御点の数が <math>n + 1</math> 個の場合はn次ベジェ曲線と同一になる。 ==== 非一様ノットベクトル ==== {{読み仮名|'''非一様ノットベクトル'''|ひいちようノットベクトル|{{lang-en-short|non-uniform knot vector}}}}はノットが不規則に配置されたノットベクトルである<ref>"ノットベクトルには、次の3つの型がある。...非一様ノットベクトル(non-uniform knot vector)" {{Harvnb|谷口|2000|p=241}} より引用。</ref><ref>"ノットベクトル ... ノットの間隔を変更すると「非一様」になる" {{Harvnb|三谷|2020}} より引用。</ref>。 == 制御点と曲線 == 基本的に曲線は制御点を通らないが、例えば :<math>t_0=t_1=t_2=0</math> のように連続した複数のノットに対し、同一の値を与えることで、対応する制御点に曲線を通すことができる。 2次B-スプライン曲線の場合、以下のようになり、曲線の始点が0番目の制御点と一致する。 :<math>\mathbf{S}(0)= \mathbf{P}_{0}</math>. ノットベクトルの最初の n + 1 個と、最後の n + 1 個を同一にすることで、曲線の端点は最初と最後の制御点になり、固定(clamped)される<ref name="PARA-knot-generation">[http://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/INT-APP/PARA-knot-generation.html Knot Vector Generation - CS3621 Introduction to Computing with Geometry Notes]</ref>。 == 例 == === 一様2次B-スプライン曲線 === 一様なノットにおける2次B-スプライン曲線において、B-スプライン基底関数は次のようになる。 :<math>b_{j,2}(t) = \begin{cases} \frac{1}{2}t^2 \\ -t^2 + t + \frac{1}{2} \\ \frac{1}{2}(1-t)^2 \end{cases}</math> これを行列形式にすると、 :<math> \mathbf{S}_i(t) = \begin{bmatrix} t^2 & t & 1 \end{bmatrix} \frac{1}{2} \begin{bmatrix} 1 & -2 & 1 \\ -2 & 2 & 0 \\ 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} \mathbf{p}_{i-1} \\ \mathbf{p}_{i} \\ \mathbf{p}_{i+1} \end{bmatrix} </math> for <math>t \in [0,1], i = 1,2 \ldots m-2</math> となる。 === 3次B-スプライン曲線 === 行列形式は次のようになる。 :<math> \mathbf{S}_i(t) = \begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix} \mathbf{R}_i \begin{bmatrix} \mathbf{p}_{i} \\ \mathbf{p}_{i+1} \\ \mathbf{p}_{i+2} \\ \mathbf{p}_{i+3} \end{bmatrix} ,\qquad t \in [0,1] </math> === 一様3次B-スプライン曲線 === :<math>\mathbf{R}_i= \frac{1}{6} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 0 & 3 & 0 \\ 1 & 4 & 1 & 0 \end{bmatrix} </math> === 開一様3次B-スプライン曲線<ref>{{cite journal | first1=Elaine | last1=Cohen | first2=Richard F. | last2=Riesenfeld | year=1982 | title=General Matrix Representations for Bezier and B-spline Curves | journal=Computers in Industry | volume=3 | pages=13-15 }}</ref> === 制御点の数を<math>M</math>とする。<math>M \geq 7</math> の場合、<math>\mathbf{R}_i</math>は次のようになる。 :<math>\mathbf{R}_0= \begin{bmatrix} -1 & \frac{7}{4} & -\frac{11}{12} & \frac{1}{6} \\ 3 & -\frac{9}{2} & \frac{3}{2} & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \end{bmatrix} </math> :<math>\mathbf{R}_1= \begin{bmatrix} -\frac{1}{4} & \frac{7}{12} & -\frac{1}{2} & \frac{1}{6} \\ \frac{3}{4} & -\frac{5}{4} & \frac{1}{2} & 0 \\ -\frac{3}{4} & \frac{1}{4} & \frac{1}{2} & 0 \\ \frac{1}{4} & \frac{7}{12} & \frac{1}{6} & 0 \end{bmatrix} </math> :<math>\mathbf{R}_i= \frac{1}{6} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 0 & 3 & 0 \\ 1 & 4 & 1 & 0 \end{bmatrix} </math> for <math>2 \leq i \leq M-6</math> :<math>\mathbf{R}_{M-5}= \begin{bmatrix} -\frac{1}{6} & \frac{1}{2} & -\frac{7}{12} & \frac{1}{4} \\ \frac{1}{2} & -1 & \frac{1}{2} & 0 \\ -\frac{1}{2} & 0 & \frac{1}{2} & 0 \\ \frac{1}{6} & \frac{2}{3} & \frac{1}{6} & 0 \end{bmatrix} </math> :<math>\mathbf{R}_{M-4}= \begin{bmatrix} -\frac{1}{6} & \frac{11}{12} & -\frac{7}{4} & 1 \\ \frac{1}{2} & -\frac{5}{4} & \frac{3}{4} & 0 \\ -\frac{1}{2} & -\frac{1}{4} & \frac{3}{4} & 0 \\ \frac{1}{6} & \frac{7}{12} & \frac{1}{4} & 0 \end{bmatrix} </math> == 有理B-スプライン == 有理B-スプラインは各制御点に重みを付けた物。詳細は[[NURBS]](非一様有理B-スプライン)を参照。 == B-スプライン曲面 == <math>u</math> 方向に <math>n_u</math> 次で <math>v</math> 方向に <math>n_v</math> 次の'''B-スプライン曲面'''(B-spline surface)は以下のように表される<ref>[http://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/surface/bspline-construct.html B-spline Surfaces: Construction - CS3621 Introduction to Computing with Geometry Notes]</ref>。 :<math>\mathbf{S}(u, v)= \sum_{i_u=0}^{m_u-n_u-2} \sum_{i_v=0}^{m_v-n_v-2} \mathbf{P}_{i_u,i_v} b_{i_u,n_u}(u) b_{i_v,n_v}(v)\ \text{,}\qquad u \in [u_{n_u},u_{m_u-n_u-1}],\ v \in [v_{n_v}, v_{m_v-n_v-1}]</math>. ノットや基底関数は曲線と同じ。制御点の個数は <math>(m_u-n_u-1) (m_v-n_v-1)</math> 個。 == 脚注 == === 出典 === {{reflist}} == 参考文献 == * {{Citation|和書|ref=harv|title=第6回 曲線・曲面の表現「Bスプライン曲線」|last=三谷|year=2020|url=https://mitani.cs.tsukuba.ac.jp/lecture/2020/cg_basics/06/06_slides.pdf|journal=筑波大学講義 コンピュータグラフィックス基礎}} * {{Cite journal|last=谷口|first=道興|year=2000|title=制御点方式による曲線形状の生成|journal=長野大学紀要|volume=22|issue=3|pages=234-242|ref=harv}} == 関連項目 == * [[スプライン曲線]] * [[ベジェ曲線]] * [[NURBS]] * [[切断冪関数]] == 外部リンク == * [https://www.ibiblio.org/e-notes/Splines/Basis.htm Interactive java applets for B-splines] * {{MathWorld|title=B-Spline|urlname=B-Spline}} {{デフォルトソート:ひいすふらいんきよくせん}} [[Category:曲線]] [[Category:数学に関する記事|Bすふらいんきよくせん]] [[de:Spline#B-Splines]]
このページで使用されているテンプレート:
テンプレート:Citation
(
ソースを閲覧
)
テンプレート:Cite journal
(
ソースを閲覧
)
テンプレート:Harvnb
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:MathWorld
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:読み仮名
(
ソースを閲覧
)
B-スプライン曲線
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報