理科系の勉強日記

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

B spline曲線と曲面

B spline曲線について勉強したかったんですけどずっと放置していたので、ついに実装して遊んでみました。 basic functionとknot vectorが曲線にどう関係してくるのか実装するまでわかっていませんでした。


S(t) = \sum_{i=0}^n{N_{i,p}(t)P_i}

Basic function


N_{i,0}(u) =  \left\{ \begin{array}{ll}
    1 & (u_i \leq u < u_{i+1}) \\
    0 & (otherwise)
  \end{array} \right. \\
N_{i,p}(u) = \frac{u-u_i}{u_{i+p}-u_i}N_{i, p-1}(u) + \frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u)

f:id:kenbell1988:20190304093622p:plainf:id:kenbell1988:20190304093638p:plain
B spline curve

f:id:kenbell1988:20190304093646p:plainf:id:kenbell1988:20190304093700p:plain
Knot vector, basic function

ついでにB spline曲面も実装しました。u方向の制御点m個とv方向の制御点n個をつかって、control netなる m \times nの行列 Pをつかって以下のように表現できます[1]。実装はgithubのjupyter notebook参照。


S(u, v) = \sum_{i=0}^n\sum_{j=0}^m{N_{i,p}(u)N_{j,q}(v)P_{i,j}}

f:id:kenbell1988:20190304093926p:plain
B spline surface

github.com

参考

[1]https://graphics.stanford.edu/courses/cs348a-09-fall/Handouts/surfaces8.pdf