🦊

二次ベジエ曲線の長さ

2023/07/11に公開

二次ベジエ曲線の長さを求める。
quadraticCurveLength

まず、二次ベジエ曲線とは3つのコントロールポイント:

(a_0, b_0, c_0),~~(a_1, b_1, c_1),~~(a_2, b_2, c_2)

により、次のように表される曲線である:

\begin{align*} x &= a_0(1-t)^2 + 2a_1 t(1-t) + a_2t^2, \\[5pt] y &= b_0(1-t)^2 + 2b_1 t(1-t) + b_2t^2, \\[5pt] z &= c_0(1-t)^2 + 2c_1 t(1-t) + c_2t^2. \end{align*}

ただし~t_0\leq t \leq t_1~とする。曲線の長さを与える式を求める。
 はじめに、

u_0 = a_0 - a_1,~~~v_0 = b_0-b_1,~~~w_0 = c_0-c_1

とおく。さらに、

u_1 = a_0-2a_1+a_2,~~v_1=b_0-2b_1+b_2,~~w_1=c_0-2c_1+c_2

とおく。そして、

A={u_1}^2 + {v_1}^2 + {w_1}^2,
B=u_1u_0 + v_1v_0 + w_1w_0,
C={u_0}^2 + {v_0}^2 + {w_0}^2,
D=AC-B^2

とおく。シュワルツの不等式より、~D\geq0~がわかる。
 このとき、求める曲線の長さは次のようになる。まず補助関数を用意する。

g(x) = \log(x + \sqrt{x^2+1}) + x\sqrt{x^2 + 1}.

曲線の長さ~L~は、まず~A>0~かつ~D>0~のとき、

L = \frac{D}{A\sqrt{A}} \left( g\left( \frac{At_1-B}{\sqrt{D}} \right) - g\left( \frac{At_0-B}{\sqrt{D}} \right) \right).

次に~A>0~かつ~D=0~の場合は、

L = \frac{1}{A\sqrt{A}} \left( (At_1-B)|At_1-B| - (At_0-B)|At_0-B| \right).

最後に~A=0~の場合、~B~~D~も0になるので、

L=2\sqrt{C}(t_1-t_0)

となる。
 以上です。

Discussion