

2015年になりました
前回、一続きの頂点群を与えて、それにフィットするようなBezier曲線を1つ(=アンカー2点+ハンドル2点)作成できるようになりました。
しかし、複数の曲線を生成してないので、かなり結果がしょぼいです。
複数の曲線を生成するのは簡単で、単に頂点群を適当に分割して、それにフィットさせれば良いだけです。
[オリジナルのfitcurve.cの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 誤差が許容範囲であれば終わります。
2.2 誤差が許容範囲よりちょい大きいくらいであれば、
任意の頂点 P に対応する t 軸上の点(前回の記事)をニュートン法で変更しつつ許容範囲に収まらないか調べます。
2.2.1 許容範囲に収まったら終わります。
2.3 誤差が許容範囲外であれば、一番誤差が大きい点で分割し、深さ優先で再帰させます。
この方法で同じように実装して検証してみたところ、確かに 2.2 によって早く収束します。
2.2 によって収束した場合は、その部分の曲線が許容誤差ぎりぎりになってしまいます。
2.2 を行わないほうが、どんどん曲線を増やしながら分割していくので、線の数は増えますが、かなりぴったりの曲線になりました。
また、2.3で、一番誤差が大きい点をアンカーにして分割していくのは、確かに効果的な気がします。
が、実際にやってみたところ、点群のインデックスを半分に分割していったほうが、曲線が少ない場合に良い結果が得られました。
Bezier曲線は、自由度が高いので、細かい範囲で使うよりも、ある程度大きな範囲で使ったほうが、効果的なのかもしれません
さらに、今回自分が考えている用途では、指定した曲線数で近似する、という機能も欲しいため、
2.3 で、深さ優先ではなく、幅優先で再帰させ、分割数をカウントしていくようにしました
まとめると、
[uimacの場合]
1. 全ての頂点に対して、曲線を1回フィットさせます(前回の記事)
2.1 分割数が指定数に達していれば終わります。
2.2 誤差が許容範囲であれば終わります。
2.3 分割数をインクリメントします
2.4 誤差が許容範囲外であれば、頂点群のインデックスの半分で分割し、幅優先で再帰させます。
結果的に、オリジナルで実装されていたニュートン法は要りませんでした。
文字ばっかりですみませんが、そろそろプラグイン化して配布を予定しています。