3

閉じたベジェ曲線(おそらく自己交差)をバイナリビットマップに変換するアルゴリズムが必要です。内側のピクセルは0、外側は1です。ベジェ曲線にいくつかの操作を実装する必要があるコードを書いていますが、誰かがベジェに関するリソースやチュートリアルを教えてもらえますか?ウィキペディアなどは、最適化、減算、結合、結び目の挿入と削除、およびその他の操作については何も述べていません:-)

代替テキストhttp://www.imagechicken.com/uploads/1271001073057545100.jpg

4

2 に答える 2

4

Charles Loop と Jim Blinn によるこの論文では、あなたの質問について詳しく説明しています。

もう 1 つのオプションは、ベジエ曲線を線分にテッセレーションしてから、お気に入りのポリゴン塗りつぶしアルゴリズムを使用することです。

于 2010-04-11T15:15:07.457 に答える
2

テッセレーション オプションは非常に効率的で、優れた結果が得られることを付け加えたいと思います。出力が多角形のように見えると思うので、ベジエ曲線を線分で近似するのは間違っているように思えます。コツは、線分を十分に短くして、エラーが非常に小さくなるようにすることです (たとえば、1/10 ピクセル未満)。

以下は、ステップ サイズを計算するために使用した式です。これにより、最大誤差 (つまり、実際の曲線からの線分の偏差) がデルタ未満になるようにします。

(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4) をピクセル座標でのベジエ曲線の制御点とする.j

  dd0 = 平方 (x1-2*x2+x3) + 平方 (y1-2*y2+y3);
  dd1 = 平方 (x2-2*x3+x4) + 平方 (y2-2*y3+y4);
  dd = 6*sqrt(max(dd0, dd1));

次に、dd は曲線上の 2 次導関数の最大値です。3 次関数の 2 次導関数は線形関数であるため、この最大値は終点で発生する必要があります。ここでは、x*x の省略形として square(x) を使用しています。

  もし (8*デルタ > dd) {
    イプシロン = 1;
  } そうしないと {
    イプシロン = sqrt(8*デルタ/dd);
  }

次に、イプシロンはステップ サイズです: t=0、t=イプシロン、t=2*イプシロン、...、(および t=1 の最後のエンドポイント) で線分の端点を選択した場合、線分は元の曲線のデルタ内になります。

デルタ = 0.1 を選択すると、元の曲線と視覚的に区別できないビットマップ出力が得られます。

于 2010-08-18T14:36:01.650 に答える