# Bezier Curves

You can draw quadratic Bezier curves with the command
`Q(l,lc,ac)`

. The variable `l`

is the straight line
distance, in the current direction, to the point the curve will
connect to. The variable `lc`

is the distance to the control
point which is at an angle `ac`

with respect to the current
direction. For positive `ac`

this is counterclockwise from the
current direction and for negative `ac`

it is clockwise. If you
draw lines from the curve start and end points to the control point
then the curve will start and end tangent to those lines.

The program `(bezier1.nll)`

draws a quadratic Bezier curve
between two points and it draws lines from the start and end of the
curve to the control point so you can see how the curve is tangent to
the lines. The command `Q(1,1.5,ac)`

indicates that the
straight line distance between the start and end points is 1. The
distance of the control point from the start point is 1.5 and the
direction of the control point is `ac`

which is set to
`pi/6`

.

#### Program: (bezier1.nll)

l = 1; lc = 1.5; ac = pi/6; lp = sqrt(l^2+lc^2-2*l*lc*cos(ac)); ap = pi-asin(lc*sin(ac)/lp); START : P(0.1,0.1) T(pi/6) [T(ac) L(lc) T(-ac-ap) L(lp)] Q(1,1.5,ac);

#### Command line

nell bezier1.nll START 3 | nellsvg 1.25 1.5 in 0.015 1 > bezier1.svg

One of the nice things you can do with a Bezier curve is draw an exact
parabola. Program `(bezier2.nll)`

draws four parabolas between
the same two points separated by distance `l=2`

. The parabolas
are of the form `y=ax^2`

for `a=2, 1, 1/2, 1/4`

.

#### Program: (bezier2.nll)

a = 2; l = 2; P1 : [Q(l,(l/2)*sqrt(a^2*l^2+1),atan(-a*l))] A(a,a/2); START : P(0,2) S(P1,4);

#### Command line

nell bezier2.nll START 3 | nellsvg 2 2 in 0.015 1 > bezier2.svg

Using parabolas you can create a very close approximation to a sine
function. Program `(bezier3.nll)`

draws an approximation of
three periods of a sine function. Each half period is actually a
parabola. The same control point distance is used for each parabola
but the control point angles alternate in sign.

#### Program: (bezier3.nll)

a = 4; l = 1; lc = (l/2)*sqrt(a^2*l^2+1); ac = atan(-a*l); P1 : Q(l,lc,-ac) Q(l,lc,ac); START : P(0,1) S(P1,3);

#### Command line

nell bezier3.nll START 3 | nellsvg 6 2 in 0.02 1 > bezier3.svg

The program `(bezier4.nll)`

draws a heart shaped object. You can
experiment with different shapes by changing the values of `lc`

and `ac`

.

#### Program: (bezier4.nll)

lc = 3; ac = pi/5; START : M(1) T(pi/2) [Q(1,lc,ac)] Q(1,lc,-ac);

#### Command line

nell bezier4.nll START 3 | nellsvg 2 2 in 0.02 1 > bezier4.svg

The program `(bezier5.nll)`

draws a flower like object.

#### Program: (bezier5.nll)

T1 : [Q(1,2,pi/10) M(0.25) C(0.1)] [Q(1,2,-pi/10)]; T2 : S(T1,1) T(pi/5); START : P(1.4,1.4) S(T2,10);

#### Command line

nell bezier5.nll START 3 | nellsvg 2.8 2.8 in 0.02 1 > bezier5.svg

The program `(clover.nll)`

draws a four leaf clover.

#### Program: (clover.nll)

l = 1; lc = 1.75; ac = 0.22*pi; as = -3*pi/4+ac/2; stem angle das = 0.02; controls stem width LEAF : [Q(l,lc,ac)] [Q(l,lc,-ac)]; T1 : S(LEAF,1) T(pi/2); STEM : [T(as-das) Q(2,1.5,-pi/8)] T(as+das) Q(2,1.5,-pi/8); START : P(1.25,1.75) T(pi/3) S(T1,4) S(STEM,1);

#### Command line

nell clover.nll START 3 | nellsvg 2.6 3 in 0.02 1 > clover.svg

You can draw cubic Bezier curves with the command
`B(l,lc1,ac1,lc2,ac2)`

. The command is very similar to the
quadratic Bezier command but with one extra control point whose
distance and direction are with respect to the end point of the
curve. The extra control point allows more complicated curves to be
drawn. As in the quadratic curve, the variable `l`

is the
straight line distance, in the current direction, to the point the
curve will connect to. `lc1`

and `ac1`

are the distance
and direction of the first control point with respect to the start of
the curve while `lc2`

and `ac2`

are the distance
and direction of the second control point with respect to the end of
the curve. If you draw lines from the start of the curve to the first
control point and from the end of the curve to the second control
point then the curve will be tangent to those lines at the start and
end.

The program `(bezier6.nll)`

draws a cubic Bezier curve between
two points and it draws lines from the start and end of the curve to
the control points so you can see how the curve is tangent to the
lines. The straight line distance between the start and end points is
1. The distance to both control points is 2 but note that for the
second control point the distance is negative which has the effect of
flipping the direction 180 degrees or `pi`

radians.

#### Program: (bezier6.nll)

l = 1; lc1 = 2; ac1 = pi/6; lc2 = -2; ac2 = pi/6; START : P(0.5,1) [T(ac1) L(lc1)] B(l,lc1,ac1,lc2,ac2) [T(ac2) L(lc2)];

#### Command line

nell bezier6.nll START 3 | nellsvg 2 2 in 0.02 1 > bezier6.svg

The program `(bezier7.nll)`

is basically the same as
`(bezier6.nll)`

but with the sign on `ac2`

negative. This has a dramatic effect on the shape of the curve.

#### Program: (bezier7.nll)

l = 1; lc1 = 2; ac1 = pi/6; lc2 = -2; ac2 = -pi/6; START : P(0.5,1) [T(ac1) L(lc1)] B(l,lc1,ac1,lc2,ac2) [T(ac2) L(lc2)];

#### Command line

nell bezier7.nll START 3 | nellsvg 2 2 in 0.02 1 > bezier7.svg

The program `(bezier8.nll)`

draws a Bezier curve between the
vertices of an n-sided polygon.

#### Program: (bezier8.nll)

n = 7; a = 2*pi/n; l = 1; lc1 = 2; ac1 = pi/6; lc2 = -2; ac2 = -pi/6; T1 : B(l,lc1,ac1,lc2,ac2) T(a); START : P(0.75,0) S(T1,n);

#### Command line

nell bezier8.nll START 3 | nellsvg 2.5 2.25 in 0.02 1 > bezier8.svg

The program `(bezier9.nll)`

is the same as
`(bezier8.nll)`

but with different parameter values.

#### Program: (bezier9.nll)

n = 4; a = 2*pi/n; l = 2; lc1 = 4; ac1 = pi/6; lc2 = -4; ac2 = -pi/6; T1 : B(l,lc1,ac1,lc2,ac2) T(a); START : S(T1,n);

#### Command line

nell bezier9.nll START 3 | nellsvg 2 2 in 0.02 1 > bezier9.svg