views:

381

answers:

1

Assuming I'm using some graphic API which allows me to draw bezier curves by specifying the 4 necessary points: start, end, two control points.

Can I reuse this function to draw x percent of the 'original' curve (by adjusting the control points and the end point)?

Or is it impossible?

Unnecessary information, should someone care:

  • I need the whole thing to draw every n % of the original
    bezier curve with different color and/or line style
  • I'm using Java's Path2D to draw bezier curves:

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

What you need is the De Casteljau algorithm. This will allow you to split your curve into whatever segments you'd like.

However, since you're dealing with just cubic curves, I'd like to suggest a slightly easier to use formulation that'll give you a segment from t0 to t1 where 0 <= t0 <= t1 <= 1. Here's some pseudocode:

u0 = 1.0 - t0
u1 = 1.0 - t1

xa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
xb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
xc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0
xd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1

ya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
yb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
yc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0
yd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1

Then just draw the Bézier curve formed by (xa,ya), (xb,yb), (xc,yc) and (xd,yd).

Note that t0 and t1 are not exactly percentages of the curve distance but rather the curves parameter space. If you absolutely must have distance then things are much more difficult. Try this out and see if it does what you need.

Edit: It's worth noting that these equations simplify quite a bit if either t0 or t1 is 0 or 1 (i.e. you only want to trim from one side).

Also, the relationship 0 <= t0 <= t1 <= 1 isn't a strict requirement. For example t0 = 1 and t1 = 0 can be used to "flip" the curve backwards, or t0 = 0 and t1 = 1.5 could be used to extend the curve past the original end. However, the curve might look different than you expect if you try to extend it past the [0,1] range.

Naaff
+1 Some commentary stating explicitly that points a and d are points on the original curve that define the extent of a new partial curve would be helpful. Also, points b and c are newly defined control points (i.e., only loosely related to the original control points).
Bob Cross
@Bob Cross: Noted. For the curious, point b lies along the tangent of the curve at point a and point c lies along the tangent of the curve at point d. In fact, a=p(t0), b=a+p'(t0)/3, c=d-p'(t1)/3 and d=p(t1), where p(t) is the point on the curve at t, and p'(t) is the 1st derivative of the curve at t.
Naaff