二次ベジエ曲線の長さを求めます。これは積分で求めることができます。応用は特に考えていません。興味があって調べました。
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) $$
となる。
以上です。