LoginSignup
2
1

More than 5 years have passed since last update.

3次ベジェ曲線の変曲点、そして、それが分かるとなぜ嬉しいか

Last updated at Posted at 2017-03-13

とりあえず、断章。

 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曲面(まあ、つまり、スペキュラが綺麗に乗る、というメリットしかないんだが)を作るアルゴリズムを思いついたので、それを書こうかとも思ったんだが、図をいっぱい書かなきゃなので諦めた。お遊びだしね、ま、いいか。

そういうわけで、忙しいので小ネタだけ更新してみた。ガブリール見てから仕事する。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1