ベジエ関数表現とベジエクリッピング法による
パラメトリック曲線の多様な演算の計算法

発表 第1部:多項式の解、曲線処理、距離関数(第1章 11項目+第2章から距離・接線・包含形状 5項目、全16項目)

1.基本の考え方 ― あらゆる問題を「ベジエ関数の零点」へ

パラメトリック曲線・曲面に関する多くの問い(交点、極値、変曲点、曲率の極値、接線、最近点…)は、 最終的に1変数(または2変数)の方程式 f(t) = 0 に帰着します。 ベジエ曲線の座標はベルンシュタイン多項式で表されるため、その和・差・積・微分もまたベルンシュタイン多項式、すなわちベジエ関数になります。

ベジエ関数には「制御点の凸包の中にグラフが含まれる」という性質があるので、凸包が t 軸と交わらない区間には解が絶対に存在しないと断言できます。これを繰り返して解の存在区間を削り込むのがベジエクリッピング法(Nishita, Sederberg, Kakimoto 1990)です。

幾何の問い
極値・変曲点・最近点…
→
条件式
C′(t)=0, C′×C″=0 …
→
ベジエ関数化
制御係数 bi を計算
→
ベジエクリッピング
凸包で区間を削る
→
全ての解
取りこぼしなし
ベジエ関数: f(t) = Σi=0..n bi Bin(t),  Bin(t) = nCi ti(1−t)n−i, t ∈ [0,1]
制御点(グラフ上): ( i/n , bi ) i = 0,…,n ← t 座標は等間隔に固定
性質ベジエクリッピングでの役割
凸包性グラフ (t, f(t)) は制御点 (i/n, bi) の凸包に含まれる → 凸包と t 軸の交差区間の外に解はない。
端点補間f(0)=b0, f(1)=bn。全係数が同符号なら区間内に解なし(即座に棄却)。
分割(de Casteljau)任意の部分区間 [a,b] の係数を数値的に安定に計算できる。
変動減少性係数列の符号変化数 ≥ 区間内の根の数。符号変化が1回なら単根が1つ(停止判定に利用可)。

2.ベジエクリッピング法のアルゴリズム

  1. 凸包を求める:制御点 (i/n, bi) の凸包を作る。
  2. t 軸との交差:凸包と t 軸の交わり [tmin, tmax] を求める。交わらなければ「解なし」でこの区間を破棄。
  3. クリップ:de Casteljau 法で [tmin, tmax] の部分ベジエ関数を切り出し、パラメータを [0,1] に正規化して 1 に戻る。
  4. 分割:1回の反復で区間が 20% 未満しか縮まらない(複数解の可能性)ときは区間を2等分し、両方を独立に処理する。
  5. 終了:区間幅が許容誤差 ε 未満になったら、その中点を解とする。
凸包と t 軸の交差は、符号の異なる係数対 (i, j) を結ぶ線分の t 切片の最小・最大で求められる:
t = i/n + (j/n − i/n) · bi / (bi − bj) (bi·bj < 0 の全ての組)
特徴内容
頑健性初期値が不要。ニュートン法のような発散・解の見落としがない。
収束性単根の近傍では1反復ごとに区間幅がほぼ2乗で縮む(2次収束に近い)。
全解探索区間の2分割を併用すれば、区間内の実根を全て列挙できる。
有理関数有理ベジエ関数 N(t)/W(t) は重み W>0 なら分子 N(t) の零点だけを解けばよい。

3.動作例:4次ベジエ関数の全根を求める

「次の反復」を押すと1ステップずつ進みます。図は現在処理中の区間を [0,1] に拡大した表示です(青=制御多角形、薄青=凸包、赤=凸包と t 軸の交差区間)。係数は書き換えて試せます。

係数 b0…bn:
f(t) 制御多角形 凸包 クリップ後の区間 確定した根
反復処理区間 [a, b]クリップ後縮小率処理

4.演算の道具箱 ― ベジエ関数のまま計算するための公式

各種の演算は、以下の5つの道具を組み合わせるだけで「ベジエ関数の係数」として直接計算できます。べき級数に戻す必要はありません。

演算公式(f: n 次 係数 ai、g: m 次 係数 bj)結果の次数
微分f′(t) = n Σi=0..n−1 (ai+1 − ai) Bin−1(t)n−1
積(fg)k = Σi+j=k [ nCi · mCj / n+mCk ] ai bjn+m
次数上げa′i = (i/(n+1)) ai−1 + (1 − i/(n+1)) ai (和・差の前に次数を揃える)n+1
和・差次数を揃えた後、係数ごとに加減算max(n,m)
分割de Casteljau 法で任意の t で2つのベジエ関数に分けるn
内積・外積A·B = AxBx + AyBy、A×B = AxBy − AyBx(積と和の組合せ)n+m
次数の数え方のコツ:C(t) が n 次なら C′ は n−1 次、C″ は n−2 次。積では次数が足し算になる。 例:C′×C″ → (n−1)+(n−2) = 2n−3 次、|C′|² → 2(n−1) 次、(C−P)·C′ → n+(n−1) = 2n−1 次。

5.演算一覧表(全16項目)

基本的にここで述べる一部演算は既発表であるが、変曲点、曲率の極値、弧長パラメータ化、自己交差、オフセットとトリミングについては新規性のある演算である(表中 新規)。n はベジエ曲線(曲面)の次数。「次数」は解くべきベジエ関数の次数です。

No.演算解く方程式(ベジエ関数)次数計算のポイント
1n次ベジエ関数の解f(t) = Σ biBin(t) = 0n基本形そのもの。凸包クリップ+2分割で全根
2n次多項式の解p(x) = Σ aixi = 0 をベジエ形式へn根の存在範囲を [0,1] へ写像してから変換
3べき級数→ベジエ変換bk = Σi≤k (kCi/nCi) ain正方三角行列の積。逆変換も可能
4曲線の極値x′(t) = 0、y′(t) = 0n−1差分係数 n(Pi+1−Pi) を成分ごとに解く
5変曲点 新規C′(t) × C″(t) = 02n−3外積を積公式で計算。最高次は常に相殺
6曲率の極値 新規N(t) = σ′w − (3/2)σw′ = 04n−6σ=C′×C″, w=|C′|²。次数上げして差を取る
7弧長パラメータ化 新規w(t) = |C′(t)|²(速さの2乗)2n−2w の凸包で速さの上下限、w′=0 で分割点
8自己交差 新規C(t) = C(s), t ≠ s(FAT Line)n単調区間に分割してから区間対の交差判定
9オフセットとトリミング 新規E(u) = (C(u) − P) · C′(u) = 02n−1オフセット点 P から元曲線への最近距離 < |d| なら除去
10平面から曲面への距離h(u,v) = n·S(u,v) − dn×m係数 hij = n·Pij − d をそのまま得る
11点から曲面への距離D(u,v) = |S(u,v) − P|²2n×2m最近点は Du=Dv=0 の連立
第2章(2次元平面の幾何)からの追加:距離関数と接線
12線分と曲線の距離(交点・最近点)交点:d(t) = N·(C(t) − A) = 0
最近点:d′(t) = 0 [5]
n / n−1係数は di = N·(Pi − A)。有理曲線は分子 n 次、微分の分子 2n−1 次
13点と曲線の距離(最近点)(C(t) − P) · C′(t) = 02n−1|C−P|²(2n 次)の微分。端点も候補。有理曲線は 3n−1 次
14点から曲線への接線(C(t) − P) × C′(t) = 02n−1外積=0 で C−P と接線が平行。有理曲線でも 2n−1 次に簡約
15包含箱(バウンディングボックス)y 軸からの距離 x(t)、x 軸からの距離 y(t) の最大・最小
x′(t) = 0, y′(t) = 0
n−1極値点+端点で xmin, xmax, ymin, ymax。任意方向の直線で傾いた箱も可
16包含円 [6][7]e(t,R) = |P(t) − Q|² − R²(2n 次)の最大値
e′(t) = 0(2n−1 次)
2n / 2n−12端点の中点を初期中心とし、最遠点が出れば垂直二等分線上で3点等距離の点へ移動

6.各項目の計算ヒント

1n次ベジエ関数の解法n 次

実演

2n次多項式の解法n 次

実演 解説

3多項式からベジエ関数への変換n 次

p(t) = Σ ai ti(t ∈ [0,1]) ⇒ bk = Σi=0..k ( kCi / nCi ) ai
実演

4n次ベジエ曲線の極値の検出n−1 次

C′(t) = n Σi=0..n−1 (Pi+1 − Pi) Bin−1(t)
実演

5n次ベジエ曲線の変曲点の検出2n−3 次

σ(t) = C′(t) × C″(t) = x′(t) y″(t) − y′(t) x″(t) = 0
実演

6n次ベジエ曲線の曲率の極値検出4n−6 次

κ(t) = σ / w3/2, σ = x′y″ − y′x″(2n−3 次), w = x′² + y′²(2n−2 次)
κ′(t) = 0 ⇔ N(t) = σ′w − (3/2)σw′ = 0 (両辺を2倍して 2σ′w − 3σw′ でも可)
実演 解説

7ベジエ曲線の弧長パラメータ化2n−2 次

s(t) = ∫0t √w(τ) dτ, w(t) = |C′(t)|²(2n−2 次のベジエ関数)
実演 解説

8n次ベジエ曲線の自己交差の検出FAT Line

実演

9n次ベジエ曲線のオフセット曲線とトリミング2n−1 次

O(u) = C(u) + d · N(u)(N は単位法線)
E(u) = (C(u) − P) · C′(u) = 0 … 点 P から C への垂線の足(2n−1 次)
実演 解説

10面から曲面への距離関数n×m 次

h(u,v) = n·S(u,v) − d = ΣiΣj (n·Pij − d) Bin(u) Bjm(v)
実演

11点から曲面への距離関数2n×2m 次

D(u,v) = |S(u,v) − P|² (2n×2m 次)
最近点: (S − P)·Su = 0((2n−1)×2m 次)かつ (S − P)·Sv = 0(2n×(2m−1) 次)
実演

第2章からの追加項目:線分・点からの距離関数と接線

12線分とベジエ曲線の距離(交点・最近点)n 次 / n−1 次

線分 AB の単位法線 N に対し: d(t) = N·(C(t) − A) = Σi N·(Pi − A) Bin(t) (n 次)
交点:d(t) = 0 / 最近点(交点がない場合):d′(t) = n Σ (di+1 − di) Bin−1(t) = 0 (n−1 次)
実演 交点 有理曲線 エルミート Bスプライン NURBS 関連発表:[5](NURBS曲線と線分の交差・最近距離)

13点とベジエ曲線の距離(最近点)2n−1 次

D(t) = |C(t) − P|² = Σk=0..2n Dk Bk2n(t) (2n 次)
最近点:D′(t)/2 = (C(t) − P) · C′(t) = 0 (n 次 × (n−1) 次 → 2n−1 次)
実演(有理曲線) 非有理版の実演は追加予定

14点からベジエ曲線への接線2n−1 次

接点の条件:f(t) = (C(t) − P) × C′(t) = (x−px) y′ − (y−py) x′ = 0 (2n−1 次)
実演

第2章からの追加項目:包含箱・包含円

15ベジエ曲線の包含箱(バウンディングボックス)n−1 次

y 軸(直線 x = 0)から曲線への符号付き距離:dy(t) = x(t) = Σ xi Bin(t) (n 次)
x 軸(直線 y = 0)から曲線への符号付き距離:dx(t) = y(t) = Σ yi Bin(t) (n 次)
最大・最小の候補:x′(t) = 0、y′(t) = 0(n−1 次)の解と端点 t = 0, 1
実演は追加予定(曲面版は第2部「NURBSの包含箱・包含球」) 関連発表:[6] [7]

16ベジエ曲線の包含円2n 次の距離関数 + 2n−1 次の微分

円の中心 Q、半径 R からの距離関数(文献[6]の方法):
e(t, R) = D(t) − R² = |P(t) − Q|² − R² = Σk=0..2n dk Bk2n(t) − R² (2n 次)
微分:e′(t) = 2n Σk=0..2n−1 (dk+1 − dk) Bk2n−1(t) (隣接する係数の差だけで構成)
係数は pi = Pi − Q の内積で得られる。n = 3 の場合:
d0=p0·p0, d1=p0·p1, d2=0.4 p0·p2+0.6 p1·p1, d3=0.1 p0·p3+0.9 p1·p2,
d4=0.4 p1·p3+0.6 p2·p2, d5=p2·p3, d6=p3·p3
  1. 初期値:2端点の中点 Q0 = (P0 + Pn)/2 を中心、端点までの距離を半径 R とする(2端点を直径の両端とする円)。
  2. 早期判定:凸包性より、係数の最大値 dmax ≤ R² なら曲線全体が円の内側にあり、終了。また、隣り合う係数がともに dk < R², dk+1 < R² となる区間 k(2n 区間のうちの1つ)は円外の部分を含まないので切り捨てる。
  3. 最遠点の検出:残った区間で e′(t) = 0 となる点をベジエクリッピング法で求める。距離関数は最大値付近で上に凸なので、両端からクリップされて速く収束する。精度が必要なのは最大値付近だけで、それ以外は粗い判定でよい。
  4. 中心の移動:最遠点 F までの距離が R より大きければ、Q を2端点の垂直二等分線上で移動し、2端点と F の3点までの距離がすべて等しくなる点(3点の外接円の中心)を新しい中心とする。
    M を端点の中点、u を弦 Pn−P0 に垂直な単位ベクトルとすると、Q = M + s u,s = (|M−P0|² − |M−F|²) / (2 u·(M−F))。
  5. 繰り返し:新しい Q, R で 2.〜4. を繰り返し、最遠距離が R 以下になったら終了。

実演:包含箱(項目15)と包含円(項目16)

制御点(青丸)をドラッグすると、包含箱と包含円をその場で再計算します。 灰色の破線=包含箱、緑の破線=初期円(2端点の中点が中心)、薄い円=反復途中の円、赤=最終の包含円、橙の×=検出した最遠点。

反復中心 Q半径 Rdmax (係数最大)最遠点距離処理
関連発表:[6] [7](距離曲線による包含球の計算と交差判定)

7.まとめ

参考文献

  1. T. Nishita, T. W. Sederberg, M. Kakimoto, "Ray tracing trimmed rational surface patches," ACM SIGGRAPH Computer Graphics, 1990.
  2. T. W. Sederberg, T. Nishita, "Curve intersection using Bezier clipping," Computer-Aided Design, 1990.
  3. T. Nishita, "Applications of Bezier clipping method and their java applets," Proceedings of SCCG, 1998.
  4. 西田友是, 「Bezier Clipping およびその計算機支援設計への応用」, 福山大学工学部紀要, Vol.13, 1991.

関連発表(本資料の内容に関する最近の発表)

  1. 西田,「距離関数を用いたNURBS曲線と線分の交差および最近距離の計算」,画像電子学会 年次大会 2024,長崎,2024年8月28日.
  2. 西田,中村,「距離曲線を利用したベジエ曲線・曲面の包含球の計算と交差判定」,映像情報メディア学会 研究会,映情学技報, vol.48, pp.280-283,2024年3月.
  3. 西田,「ベジエ曲線の距離関数を用いたベジエ曲線・曲面の包含球の計算法」,情報処理学会 第86回全国大会,7C-01,2024年3月.