1. May 15, 2007

### makc

This is about flash scripting, actually. There's that thing called quadratic bezier spline,

$$p_0(1-t)^2+2p_1 t(1-t)+p_2 t^2$$,

right, and flash plugin has that "curveTo" command that apparently uses above expression for x(t) and y(t) to draw a curve between two points on screen. So, I was wondering how do I make it so that N points could be connected by smooth curve using N-1 such segments.

What I did originally was solving $$x'_{i-1}(1) = x'_i(0)$$ for subsequent control points ($$p_{1,i}$$) and same for y'-s:

$$p_{1,i} = 2p_{2,i-1} - p_{1,i-1}$$,

but this did not worked out well, because control points tend to jump around like crazy this way.

So, my next step was getting dx/dy to be same. I concluded that the curve will be still smooth if you multiply x' and y' by any positive number, and so my solution is now $$p_{1,i} = p_{2,i-1} + a ((2p_{2,i-1} - p_{1,i-1}) - p_{2,i-1}), 0 < a < 1$$ (see example for a = 0.6 here; click a few times in white rectangle).

My problem is that I don't like the way "a" hangs in it as free parameter. I need some idea how to calculate it based on real curve data (e.g., $$x_i, y_i$$). The objective can be vaguely described as getting curve to look as nice as Catmull-Rom spline does.

2. May 16, 2007

### makc

I've suddenly realized that my pitfall was attempting to solve 2D problem in 1D... so, get ready for another update.

3. Oct 7, 2007

### brien_rtb

hey makc,

Just solving p_0'(1)=p_1'(0) puts no constraint on how you want the curve to look. That is, imagine all the possible solutions to that constraint, like fitting a sinusoidal wave through your corner points. Cardinal splines put a constraint on the shape of the curve, namely that the derivative at each corner point must be in the general direction of the curve (p_i+1 - p_i-1).

You can come up with similar constraints for a spline with quadratic segments, although the details are different. With cubic segments, for each segment, you have two free control points and two constraints -- the derivatives are equal to the general direction of the curve. With quadratic segments, for each segment, you have one free control point and two constraints -- the same two. So using just a single quadratic per segment is overconstrained (there isn't a solution that satisfies both constraints) ... you need to introduce more free control points in the segment ...

One approach is to make each segment a sequence of two quadratics, which in total yields three free points per segment. The first and last should be solved using the normal Cardinal spline method. The middle can be c1, by using your original approach. Since the two end points are molded into the general shape using the Cardinal spline method, this floating center point usually comes out nicely for small "alpha" (i.e. tight). When the spline is loose, the floating middle point usually starts to turn into a visible hump.

Anyway, I have an implementation if you care for it. Just send me a note (bubble.up.soda@gmail.com).

Hope that helps.

Brien

4. Oct 8, 2007

### hotvette

For some reason the links to the pics don't work. Can you post a specific set of x,y values you are trying to fit?