17

必要な 4 つのポイント (開始、終了、2 つの制御点)を指定してベジェ曲線を描画できるグラフィック API を使用していると仮定します 。

この関数を再利用して、「元の」曲線のx パーセントを (制御点と終点を調整して)描画できますか?

それとも無理ですか?

誰かが気にする必要がある場合の不要な情報:


  • 元のベジエ曲線の n % ごとに異なる色や線のスタイルで描画するために全体が必要です
  • Java の Path2D を使用してベジェ曲線を描画しています。

    Path2D p = new GeneralPath();
    p.moveTo(x1, y1);
    p.curveTo(bx1, by1, bx2, by2, x2, y2);
    g2.draw(p);
    
4

2 に答える 2

24

必要なのは De Casteljau アルゴリズムです。これにより、カーブを任意のセグメントに分割できます。

t0ただし、3 次曲線のみを扱っているため、 fromからt1whereまでのセグメントを提供する、もう少し使いやすい定式化を提案したいと思います0 <= t0 <= t1 <= 1。ここにいくつかの擬似コードがあります:

u0 = 1.0 - t0
u1 = 1.0 - t1

qxa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1

qya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1

xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1

ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1

(xa,ya)次に、 、(xb,yb)、 で(xc,yc)形成されるベジエ曲線を描くだけ(xd,yd)です。

t0とは曲線距離t1の正確なパーセンテージではなく、曲線パラメータ空間であることに注意してください。絶対に距離を置かなければならない場合、事態ははるかに困難になります。これを試して、必要なことを行うかどうかを確認してください。

編集:t0 or のいずれかt1が 0 または 1 の場合 (つまり、片側からのみトリミングしたい場合) 、これらの方程式はかなり単純化されることに注意してください。

また、関係0 <= t0 <= t1 <= 1は厳密な要件ではありません。たとえば、t0 = 1andt1 = 0を使用してカーブを後方に「フリップ」したりt0 = 0、 andt1 = 1.5を使用してカーブを元の端を超えて延長したりできます。ただし、範囲を超えて延長しようとすると、曲線が予想とは異なるように見える場合があり[0,1]ます。

Edit2:私の最初の回答から 3 年以上経った後、MvG は私の方程式の誤りを指摘しました。最後のステップ (最終的な制御点を取得するための追加の線形補間) を忘れていました。上記の式は修正されています。

于 2009-05-18T18:51:49.103 に答える
15

別の質問の回答として、3 次曲線のセクションの制御点を計算するための数式をいくつか含めました。u = 1 − tの場合、3 次ベジエ曲線は次のように記述されます。

B( t ) = u 3 P 1 + 3 u 2 t P 2 + 3 ut 2 P 3 + t 3 P 4

P 1は曲線の始点、P 4は終点です。P 2P 3は制御点です。

2 つのパラメーターt 0t 1 (およびu 0 = (1 − t 0 )、u 1 = (1 − t 1 )) が与えられると、区間 [ t 0 , t 1 ]の曲線の部分は次のように記述されます。新しいコントロールポイント

  • Q 1 = u 0 u 0 u 0 P 1 + ( t 0 u 0 u 0 + u 0 t 0 u 0 + u 0 u 0 t 0 ) P 2 + ( t 0 t 0 u 0 + u 0 t 0 t 0 + t 0 u 0 t 0 ) P 3+ t 0 t 0 t 0 P 4
  • Q 2 = u 0 u 0 u 1 P 1 + ( t 0 u 0 u 1 + u 0 t 0 u 1 + u 0 u 0 t 1 ) P 2 + ( t 0 t 0 u 1 + u 0 t 0 t 1 + t 0 u 0 t 1 ) P 3+ t 0 t 0 t 1 P 4
  • Q 3 = u 0 u 1 u 1 P 1 + ( t 0 u 1 u 1 + u 0 t 1 u 1 + u 0 u 1 t 1 ) P 2 + ( t 0 t 1 u 1 + u 0 t 1 t 1 + t 0 u 1 t 1 ) P 3+ t 0 t 1 t 1 P 4
  • Q 4 = u 1 u 1 u 1 P 1 + ( t 1 u 1 u 1 + u 1 t 1 u 1 + u 1 u 1 t 1 ) P 2 + ( t 1 t 1 u 1 + u 1 t 1 t 1 + t 1 u 1 t 1 ) P 3+ t1t1t1P4 _ _ _ _ _ _ _

括弧内の式では、少なくともいくつかの項が等しく、組み合わせることができることに注意してください。ここで述べた式がパターンをより明確にするので、私はそうしませんでした. これらの計算をx方向とy方向について個別に実行するだけで、新しいコントロール ポイントを計算できます。

一般に、 tのパラメーター範囲の特定のパーセンテージは、長さの同じパーセンテージに対応しないことに注意してください。そのため、パスの長さをパラメーターに戻すために、曲線を積分する必要がある可能性が高くなります。または、近似値を使用します。

于 2012-07-28T23:29:22.497 に答える