3

中点近似を使用して、通常のベジェ パス図 (多くのベジェ ポイントで形成された複雑なパス) を描画するライブラリがあります。

問題なく描画できますが、高度なジオメトリ操作のサポートを追加する必要があります: 曲線の最も近い点、交点、図に点が含まれています。さらに重要なことに、パスの組み合わせ: 差、交点、排他的論理和、結合、...

これらすべてを取得するための適切なソースはありますか?

ありがとう

4

1 に答える 1

1

これらの操作のいくつかをカーブまたは閉じたパスに実装する必要がありました。それは主にラインとポリゴンの操作に要約されます。いくつかの便利な概念:

  1. 制御点はベジェパスの周りに凸包を形成します。これは、交差点に関連する操作を短絡するのに役立ちます。
  2. 曲線の細分割は適応性があり、次の細分割が大きな違いにならないときに停止する必要があります。つまり、各「半分」が異なる深さに分割される可能性があります。
  3. 中点だけでなく、任意の点で曲線を細分割できます。これは、見つかった関心点で終了するベジェ曲線を作成するのに役立ちます。

任意の細分化のサンプルコード:

 static Point2D.Double[][] splitBezier(Point2D.Double[] p) {
     return splitBezier(p, 0.5);
 }

 static Point2D.Double[][] splitBezier(Point2D.Double[] p, double t) {
    Point2D.Double[][] parts = new Point2D.Double[2][4];
    Point2D.Double ab = interpolate(t, p[0], p[1]);
    Point2D.Double bc = interpolate(t, p[1], p[2]);
    Point2D.Double cd = interpolate(t, p[2], p[3]);
    Point2D.Double abc = interpolate(t, ab, bc);
    Point2D.Double bcd = interpolate(t, bc, cd);
    Point2D.Double abcd = interpolate(t, abc, bcd);
    parts[0][0] = p[0];
    parts[0][1] = ab;
    parts[0][2] = abc;
    parts[0][3] = abcd;
    parts[1][0] = abcd;
    parts[1][2] = bcd;
    parts[1][2] = cd;
    parts[1][3] = p[3];
    return parts;
 }

 static Point2D.Double interpolate(double t, Point2D.Double a, Point2D.Double b) {
    return new Point2D.Double((1 - t) * a.getX() + t * b.getX(),
                              (1 - t) * a.getY() + t * b.getY());
 }

いくつかの便利なサイト:

于 2011-05-16T00:31:49.750 に答える