- --- In svg-developers@yahoogroups.com, "brucerindahl" <rindahl@...>

wrote:>

could

> Frank

> This is great info. Thank you! I have always wondered if there

> be an easy generic way of smoothing a line using Bezier curves.

Given

> a series of points on a line segment x0 y0, x1 y1,...,xi

yi,...,xn,yn

> could a series of control points be computed? The control points

on

> either side of a vertex would have to be co-linear with the vertex

to

> assure the first derivative is continuous and equal distance from

the

> vertex to make the second derivative continuous. The wall I always

Dear Bruce, a lot depends on what sort of result do you wanna get. I

> ran into was how to set the initial (or final) control point and an

> easy direct iteration calculation for the remaining points. Do you

> have any ideas on this?

> Thanks!

> Bruce Rindahl

>

believe, you wanna transform each link of your source polyline to

one link of Bezier curve. If so, you need to place two control poits

into each link of the source polyline. For similar task I use the

next code:

void Contur::Set_sin_cos_for_line() {

double dx1, dy1, s1, dx2, dy2, s2;

dx1=xw[1].x-xw[0].x;

dy1=xw[1].y-xw[0].y;

s1=sqrt(dx1*dx1+dy1*dy1);

dx2=xw[2].x-xw[1].x;

dy2=xw[2].y-xw[1].y;

s2=sqrt(dx2*dx2+dy2*dy2);

eFirst.X=s2*dx1*(s2+2*s1)-s1*s1*dx2;

eFirst.Y=s2*dy1*(s2+2*s1)-s1*s1*dy2;

s1=sqrt(eFirst.X*eFirst.X+eFirst.Y*eFirst.Y);

// if(s1==0)

// s1=s1;

eFirst.X=eFirst.X/s1;

eFirst.Y=eFirst.Y/s1;

dx1=xw[n-1].x-xw[n-2].x;

dy1=xw[n-1].y-xw[n-2].y;

s1=sqrt(dx1*dx1+dy1*dy1);

dx2=xw[n-2].x-xw[n-3].x;

dy2=xw[n-2].y-xw[n-3].y;

s2=sqrt(dx2*dx2+dy2*dy2);

eLast.X=s2*dx1*(s2+2*s1)-s1*s1*dx2;

eLast.Y=s2*dy1*(s2+2*s1)-s1*s1*dy2;

s1=sqrt(eLast.X*eLast.X+eLast.Y*eLast.Y);

// if(s1==0)

// s1=s1;

eLast.X=eLast.X/s1;

eLast.Y=eLast.Y/s1;

}

Here xw[k] is the source set of coordinates (my xw[0].x is your x0,

my xw[0].y is your y0 and so on. The last my point has a number n-1,

so xw[n-1].x is your xn). you may use eFirst to place the first

control point P1: as so:

P1.x=xw[0].x+r*eFirst.X, P1.y=xw[0].y+r*eFirst.Y;

r=0.33*sqrt((xw[1].x-xw[0].x)*(xw[1].x-xw[0].x)+

(xw[1].y-xw[0].y)*(xw[1].y-xw[0].y));

For the last you should use ananlogue (Pn.x=xw[n-1].x+r*eLast.X or

may be Pn.x=xw[n-1].x-r*eLast.X, I do not remember now)

Andrew - This is something I wanted to implement for quite a while. And now I

finally did.

Go to

http://frankbruder.fr.ohost.de/FeSVGDoc/

and click at "Spline interpolator"

enjoy!

I'd actually like to integrate this functionality into my path data

editor, but that won't happen before next time I rewrite the whole

editor.

I also have another idea for how to use cubic splines in a way which

would simplify the task of creating smooth curves. Well, I can work

on that when I'm not satisfied with the spline interpolator's results.

Cheers

Frank - --- In svg-developers@yahoogroups.com, "Frank Bruder" <redurbf@...> wrote:
>

So the y-coordinates of the curve are related only to the

> Changing the amplitude is easy. That is done by just scaling

> the y-coordinates of the control points by the same factor

> by which you wish to scale the amplitude.

y-coordinates of the control points? A curve with control points

at particular y-coordinates will always result in extrema

(modulo the existence of them in the first place) of the same

y-amplitude, regardless of changes in the x-coordinates of

the control points? - --- In svg-developers@yahoogroups.com, "Ken Coar" <Ken@...> wrote:
>

Yes. That is true.

> So the y-coordinates of the curve are related only to the

> y-coordinates of the control points? A curve with control points

> at particular y-coordinates will always result in extrema

> (modulo the existence of them in the first place) of the same

> y-amplitude, regardless of changes in the x-coordinates of

> the control points?

>