Bezier曲線の長さ

さんざん既出だろうけど自分でやってみたので書く。

変数の定義から。x_0, x_1を端点として、x_cをコントロールポイントとする。そして、Bezier曲線を
[tex:x(t)=(x_0+(x_c-x_0)t)+*1t]
(0\leq t\leq 1)
とする\(x(0)=x_0, x(1)=x_1\)。上記に出てくる変数はすべてn次元ベクトルとする。

x(t)の0\leq t\leq Tでの長さをL(T)として、これを求めたい。
L(T)=\int_0^t \|x^\prime (t)\|\mathrm{d}t.
[tex:x^\prime (t)=2*2t+2(x_c-x_0)=:Bt+A]より、
\begin{eqnarray}|x^\prime (t)|&=&\sqrt{|x^\prime (t)|^2}\\&=&\sqrt{|B|^2t^2+2(A\cdot B)t+|A|^2}\\&=&\sqrt{(|B|t+A\cdot B/|B|)^2+(|A|^2-(A\cdot B/|B|)^2)}\\&=:&\sqrt{(Ut+V)^2+W}.\end{eqnarray}
(B=0の場合は後述)
このとき常にW>=0なことに注意する。


ここで、f(t)=\sqrt{t^2+1}をtについて積分することを考える。
t=\sinh xとおくと、\mathrm{d}t/\mathrm{d}x=\cosh x, f(t)=\sqrt{\sinh^2 x+1}=\cosh xより、g(x)=\cosh^2 xをxについて積分すればよい。
\cosh^2 x=\frac{1+\cosh 2x}{2}より、\int g(x)\mathrm{d}x=\frac{x}{2}+\frac{\sinh 2x}{4}.
sinhの2倍角公式はsinのそれと同じことに注意して、\int f(t)\mathrm{d}t=\frac{\sinh^{-1}t}{2}+\frac{t\sqrt{1+t^2}}{2}.


さて、|x^\prime (t)|=\sqrt{(Ut+V)^2+W}で、u:=(Ut+V)/\sqrt{W}とおいて置換すると(W=0の場合は後述)、\mathrm{d}t/\mathrm{d}u=\sqrt{W}/Uに注意して、
\begin{eqnarray}\int \|x^\prime (t)\|\mathrm{d}t&=&\frac{W}{U}\int \sqrt{u^2+1}\mathrm{d}u\\&=&\frac{W}{2U}(\sinh^{-1}u+u\sqrt{1+u^2}) \end{eqnarray}.

t\mapsto uの対応は、0\mapsto V/\sqrt{W}, T\mapsto (UT+V)/\sqrt{W}となるので、
L(T)=\frac{W}{2U}[\sinh^{-1}u+u\sqrt{1+u^2}]_{V/\sqrt{W}}^{(UT+V)/\sqrt{W}}
\(\sinh^{-1}u=\log(u+\sqrt{1+u^2})\).


残ったB=0の場合とW=0の場合について考える。
W=0⇔ベクトルAとBが同じ向き⇔A=qB or B=0 (qは実数)なので、B=0はW=0に含まれる。
A=qBと表されるとき、|x^\prime (t)|=(t+q)|B|となるので、L(T)=\int_0^T (t+q)|B|\mathrm{d}t=(\frac{T^2}{2}+qT)|B|.
B=0のときは、|x^\prime (t)|=|A|となるので、L(T)=|A|T.

*1:x_c+(x_1-x_c)t)-(x_0+(x_c-x_0)t

*2:x_1-x_c)-(x_c-x_0