ActionScriptによるベジェ曲線

セグメント分割がうまくいかなかったのは、第2制御点と第3制御点が
ほぼ重なっている時に
再帰を打ち切って2次ベジェ曲線に置き換える処理を行ったせいだった。
分割されたセグメントにおいても上記は適用されているので、そのような条件で打ち切るのではなく
再帰深度に制限をつけたら上手くいった模様。
ということで、修正版をアップ。




描画メソッドはこんな感じ

function drawBezier( x1, y1, x2, y2, x3, y3, x4, y4, depth ){
  if ( depth > 5 ){
    this.curveTo( x2, y2, x4, y4 );
    return;
  }
  
  var mid_x = ( x1 + 3*x2 + 3*x3 + x4 ) / 8;
  var mid_y = ( y1 + 3*y2 + 3*y3 + y4 ) / 8;
  this.drawBezier( x1, y1, ( x1 + x2 )/2, ( y1 + y2 )/2, ( x1 + 2*x2 + x3 )/4, ( y1 + 2*y2 + y3 )/4, mid_x, mid_y, depth + 1 );
  this.drawBezier( mid_x, mid_y, ( x2 + 2*x3 + x4 )/4, ( y2 + 2*y3 + y4 )/4, ( x3 + x4 )/2, ( y3 + y4 )/2, x4, y4, depth + 1 );
}


大差ないけど
this.curveTo( x2, y2, x4, y4 );

this.lineTo( x2, y2 );
this.lineTo( x4, y4 );
で置き換えてもいいかもしれない。
所詮FLASHなわけで、描きすぎるとカクカクするのは変わらず。


分割時の引数計算があってるかどうかは、未だに分からーん・ω・)