Skip to content

付録: NURBS補間(Interpolate)のアルゴリズム要点と制御点抽出

Q: このページの目的は何ですか?

A: 本ページは point-to-curve-interpolate.md の技術的な補足です。NURBS補間の数学的な仕組み(なぜ点を通せるのか、なぜうねりが発生するのか)や、制御点の抽出方法など、より深いレベルでの挙動理解を目的としています。

NURBS補間の仕組み:制御点と補間点の関係

Q: NURBS曲線は通常「制御点」で定義されますが、なぜ「補間点」を必ず通るように作れるのですか?

A: 入力された補間点を通るように、制御点の位置を逆算(線形システムの求解)しているからです。

  1. 線形システムの構築: 各補間点について「曲線の式に特定のパラメータを代入した結果が、その点に一致する」という方程式を立てます。
  2. 連立方程式の求解: 未知数を制御点の座標として、巨大な連立一次方程式((A \cdot P = V))を解きます。
  3. 1対1の対応: 標準的な設定では、補間点の数と同じ数の制御点が生成されます。ただし、各制御点は特定の補間点のみで決まるのではなく、全補間点の位置関係によって相互に決定されます。
  4. 誤差の発生: 理論上は完全に一致しますが、浮動小数点演算の限界や、点列が極端に不規則な場合には、微小な計算誤差が生じることがあります。

Q: 補間曲線が「暴れる(不要な振動が発生する)」のはなぜですか?

A: 補間点の間隔が不規則だったり、ノイズが含まれていたりすると、連立方程式の解として制御点が補間点から大きく外れた位置に弾き飛ばされるからです。NURBSは制御点に引っ張られる性質があるため、制御点が遠くに配置されると、曲線に急激な曲がりやうねり(オーバーシュート)が生じます。

曲線の内部構造:セグメントと連続性

Q: 多数の点を通る1本のNURBS曲線は、内部でどのような構造になっていますか?

A: 1本の曲線に見えますが、内部的には複数の多項式セグメントが連結された構造をしています。

  • セグメント数: 次数3の場合、補間点数 (n) に対して (n-3) 個のセグメントで構成されます。
  • 連続性の保証: 各セグメントの境界では (C^2) 連続(曲率連続)が保証されるため、視覚的には滑らかな1本の曲線として扱えます。
  • パラメータ空間: 弦長パラメータ化(Chord)を選択すると、各セグメントの「長さ」が実際の点間距離を反映したものになります。

弧長評価(Evaluate Length)の数学的性質

Q: Evaluate Length コンポーネントは、どのようにして指定した長さの位置を特定していますか?

A: 弧長積分は一般に解析的に解けないため、数値近似と反復探索によって計算されています。

  • 処理内容: 「始点からの弧長 (s) になるパラメータ (t)」を数値的に探し出します。
  • 精度: Rhinoの内部公差(Tolerance)に基づいて収束計算を行っています。そのため、非常に高い精度が必要な計算では、ドキュメントの公差設定が結果に影響を与えることがあります。

実践:制御点の抽出と操作

Q: 生成された曲線から、NURBSの「制御点(Control Points)」を取得するにはどうすればよいですか?

A: 主に以下の手法があります。

1. Control Pointsコンポーネント(標準機能)

  • 最も一般的な方法です。入力した曲線がNURBSでない場合(LineやArc等)も、内部でNURBSに変換して制御点を返します。

2. Pythonスクリプトによる抽出(詳細情報の取得)

  • 制御点の位置だけでなく「重み(Weight)」も取得したい場合は、スクリプトを使用します。
python
import Rhino.Geometry as rg

# crv: 入力曲線
nurbs = crv.ToNurbsCurve()
if nurbs:
    # 位置(Point3d)と重み(float)をそれぞれ抽出
    points = [p.Location for p in nurbs.Points]
    weights = [p.Weight for p in nurbs.Points]

注意点:

  • 補間曲線から抽出した制御点は、元の補間点とは異なる座標にあります。
  • 制御点の順序は、曲線のパラメータ方向(開始から終了)と一致します。

Released under the MIT License.