とりあえず、断章。
P0(x0,y0), P1(x1,y1), P2(x2,y2), P3(x3,y3)
で表される3次ベジェ曲線があるとする。
パラメータはtね。
x = (1-t)^3*x0 + ...
って感じ。
でもって
X0 = x1-x0, Y0 = y1-y0,
X1 = x2-x1, Y1 = y2-y1,
X2 = x3-x2, Y2 = y3-y2
とおく。
するってえと、ベジェの変曲点は、
((X1-X2)*(Y0-Y1)-(Y1-Y2)*(X0-X1)) * t^2
- (2*(X1*Y0-X0*Y1)+(X0*Y2-X2*Y0)) * t
+ X1*Y0-Y1*X0 = 0
(0 < t < 1)
の解になる。tの範囲が開区間なのは、後で述べる「活用方法」において、端っこの変曲点は気にしなくて良いからだ。この式に至る詳しい解説は端折る。分からなければ考えて、分かったらQiitaに記事を書こう(丸投げ)。
判別式を整理すると、
D = (X0*Y2-X2*Y0)^2 - 4*(X2*Y1-X1*Y2)*(X1*Y0-X0*Y1)
なんか、外積がずらずらでてきて、サイクリックだし、正しそうだね。ちなみにmaximaって、こういう式変形下手だよね。外積っぽい形を拾ってまとめる、とかしてくれない。まあ、そういうツールじゃないもんね。
で、変曲点が分かると何が嬉しいって、色々嬉しい。特に分割する時が嬉しいかな。例えばね、変曲点を含まないベジェ曲線は、制御点を順番通りに並べると凸包になる。ほら。変曲点を含まないベジェ曲線を任意の点で分割しても、分割されたそれぞれのベジェ曲線は変曲点を含まない。ほら。S字になってるベジェ曲線のための配慮をしないで、分割再帰できるってこと。ちょっとだけど嬉しいよね。凸包の「厚み」を計算して再帰の止め時を判定する時も通常ヘロン4回のところヘロン2回で済むし、距離計算するんでも通常線分6本の評価が必要なところ4本の評価で済む。最初だけで良いってことは、精度の高い処理をしたい時ほど嬉しいってことだ。
ちなみに、別のお遊びをしている時に、お手軽に法線だけ弄ってイカサマG2曲面(まあ、つまり、スペキュラが綺麗に乗る、というメリットしかないんだが)を作るアルゴリズムを思いついたので、それを書こうかとも思ったんだが、図をいっぱい書かなきゃなので諦めた。お遊びだしね、ま、いいか。
そういうわけで、忙しいので小ネタだけ更新してみた。ガブリール見てから仕事する。