必要なのは De Casteljau アルゴリズムです。これにより、カーブを任意のセグメントに分割できます。
t0
ただし、3 次曲線のみを扱っているため、 fromからt1
whereまでのセグメントを提供する、もう少し使いやすい定式化を提案したいと思います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 = 1
andt1 = 0
を使用してカーブを後方に「フリップ」したりt0 = 0
、 andt1 = 1.5
を使用してカーブを元の端を超えて延長したりできます。ただし、範囲を超えて延長しようとすると、曲線が予想とは異なるように見える場合があり[0,1]
ます。
Edit2:私の最初の回答から 3 年以上経った後、MvG は私の方程式の誤りを指摘しました。最後のステップ (最終的な制御点を取得するための追加の線形補間) を忘れていました。上記の式は修正されています。