views:

36

answers:

1

So I need to find out where the control points would be for a cubic bezier curve when only knowing points on the curve, the points can lie in 3D. It would be ideal if I could do this for any number of points on the curve. Most of what I have found deals only with 2D, or only for 4 points.

+1  A: 

Let me see if I understand you: you want an interpolating Bezier curve, going through a given set of points P0 P1 ...
but drawn as Bezier curves, with a function like

bezier4( nstep, Pj, Cj, Dj, Pj+1 )  -- control points Cj, Dj

That is, you want to derive two Bezier control points Cj, Dj for each piece Pj -- Pj+1 ?

One way of deriving such control points is to use the Bernstein polynomial basis

b0(t) = (1-t)^3
b1(t) = 3 (1-t)^2 t,
b2(t) = 3 (1-t) t^2
b3(t) = t^3

bezier4(t) = b0(t) P0  +  b1(t) C0  +  b2(t) D0  +  b3(t) P1
= P0 at t=0, tangent --> C0
= P1 at t=1,  tangent <-- D0

and look up or derive the interpolating aka Catmull-Rom spline that goes through P-1 P0 P1 P2:

b0(t) P0
+ b1(t) (P0 + (P1 - P-1) / 6)
+ b2(t) (P1 - (P2 - P0) / 6)
+ b3(t) P1
= P0 at t=0, P1 at t=1

We want bezier4(t) to be exactly the same curve as CatmullRom(t), so:

C0 = P0 + (P1 - P-1) / 6
D0 = P1 - (P2 - P0) / 6

Given N points P0 P1 ... (in 2d 3d ... anyd), take them 4 at a time; for each 4, that formula gives you 2 control points Cj, Dj for

bezier4( nstep, Pj, Cj, Dj, Pj+1 )

Does this make sense, is it what you want ?
(For a bounty, I'd cobble some Python / numpy together.)

Denis
Thanks for the reply, from what I have read this looks like a valid approach, but I am pretty rusty with formulas. I am not sure what P-1 or t represents.
Saebin
P-1 P0 P1 P2 are just names for 4 points in a row along the curve(call them P1 P2 P3 P4 if you like); and t usually runs 0 to 1 along a piece of curve -- think of moving along it from 0 to 1 second. Google spline (introduction|tutorial) gives 1.7m hits ...
Denis
Ah ok, P-1 seems weird to use though. Also, I assumed t was simply a parameter on the curve and based on that you know how much influence each control point has on that part of the curve... but since I only know points on the curve, I thought you would be plugging in the parameter (and position) of each known point in order to calculate the control points. I still need to plug in some more test numbers... just ran out of time. Thanks for the help so far though.
Saebin