らんだむな記憶

blogというものを体験してみようか!的なー

de Casteljau's algorithm

面倒臭そうだったので、ずっと放置していたが、Bézier曲線のde Casteljau's algorithmに触れてみた。
実際に計算したらそんなに面倒臭くもなかった。
Paul de Casteljauという物理学者にして数学者なフランス人によるらしいのだが、"ポール・ドゥ・カストゥリョ" みたな読み方をすれば良いだろうか...。

P0 P1 P2 P3 A B C D E F

上記を3次曲線として、$P_0,\ P_1,\ P_2,\ P_3$をコントロールポイントとする。$t$をパラメータとして(上図では$t = 0.3$の時を描いた)、
$A = P_0 + (P_1 - P_0)t,$
$B = P_1 + (P_2 - P_1)t,$
$C = P_2 + (P_3 - P_2)t,$
$D = A + (B - A)t,$
$E = B + (C - B)t,$
$F = D + (E - D)t$
と置いた時に、$F$がBézier曲線の$t$での座標を与えることを見たい。正直、単に上式を計算すれば終わりだったのだが...。
計算すると、
$D = P_0 + 2(P_1 - P_0)t + (P_2 - 2P_1 + P_0)t^2,$
$E = P_1 + 2(P_2 - P_1)t + (P_3 - 2P_2 + P_1)t^2$
となるので
$F = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t)t^2 P_2 + t^3 P_3$となりますね。終わり。というだけだった。

図から直観的に

  • Bézier曲線はコントロールポイントの凸包に含まれる

というのが見て取れる。式で示すのは大変そうだが、図で見ると分かりやすい。

しっかし、svg要素は便利だな。いちいちpngで描かんでもhtml内にこれくらいなら埋め込めるとは。

図からなんか直観的には "明らか" と思いたくなるが、次は点$F$のところでBézier曲線をsplitして2つにできることを見ていきたいところだ。図の中に自然に現れている棒切れがハンドルになっているはず、である。