Put together rational spline

`rp = rpmak(breaks,coefs) `

rp = rpmak(breaks,coefs,d)

rpmak(breaks,coefs,sizec)

rs = rsmak(knots,coefs)

rs
= rsmak(shape,parameters)

Both `rpmak`

and `rsmak`

put
together a rational spline from minimal information. `rsmak`

is
also equipped to provide rational splines that describe standard geometric
shapes. A rational spline must be scalar- or vector-valued.

`rp = rpmak(breaks,coefs) `

has the same effect as the command `ppmak(breaks, coefs)`

except
that the resulting ppform is tagged as a rational spline, i.e., as
a rpform.

To describe what this means, let *R* be the
piecewise-polynomial put together by the command `ppmak(breaks,coefs)`

,
and let *r*(*x*) = *s*(*x*)/*w*(*x*)
be the rational spline put together by the command `rpmak(breaks,coefs)`

.
If `v`

is the value of *R* at *x*,
then `v(1:end-1)/v(end)`

is the value of *r* at *x*.
In other words, *R*(*x*) = [*s*(*x*);*w*(*x*)].
Correspondingly, the dimension of the target of *r* is
one less than the dimension of the target of *R*.
In particular, the dimension (of the target) of *R* must
be at least 2, i.e., the coefficients specified by `coefs`

must
be `d`

-vectors with `d `

> 1. See `ppmak`

for
how the input arrays `breaks`

and `coefs`

are
being interpreted, hence how they are to be specified in order to
produce a particular piecewise-polynomial.

`rp = rpmak(breaks,coefs,d) `

has the same effect as `ppmak(breaks,coefs,d+1)`

,
except that the resulting ppform is tagged as being a rpform. Note
that the desire to have that optional third argument specify the dimension
of the target requires different values for it in `rpmak`

and `ppmak`

for
the same coefficient array `coefs`

.

`rpmak(breaks,coefs,sizec) `

has the same effect as `ppmak(breaks,coefs,sizec)`

except
that the resulting ppform is tagged as being a rpform, and the target
dimension is taken to be `sizec(1)-1`

.

`rs = rsmak(knots,coefs) `

is similarly related to `spmak(knots,coefs)`

, and `rsmak(knots,coefs,sizec)`

to `spmak(knots,coefs,sizec)`

.
In particular, `rsmak(knots,coefs)`

puts together
a rational spline in B-form, i.e., it provides a rBform. See `spmak`

for how the input arrays `knots`

and `coefs`

are
being interpreted, hence how they are to be specified in order to
produce a particular piecewise-polynomial.

```
rs
= rsmak(shape,parameters)
```

provides a rational
spline in rBform that describes the shape being specified by the character vector
`shape`

and the optional additional
`parameters`

. Specific choices are:

rsmak('arc',radius,center,[alpha,beta]) rsmak('circle',radius,center) rsmak('cone',radius,halfheight) rsmak('cylinder',radius,height) rsmak('southcap',radius,center) rsmak('torus',radius,ratio)

with `1`

the default value for `radius`

, `halfheight`

and `height`

,
and the origin the default for `center`

, and the
arc running through all the angles from `alpha`

to `beta`

(default
is `[-pi/2,pi/2]`

), and the cone, cylinder, and torus
centered at the origin with their major circle in the (x,y)-plane,
and the minor circle of the torus having radius `radius*ratio`

,
the default for `ratio`

being `1/3`

.

From these, one may generate related shapes by affine transformations,
with the help of `fncmb`

`(rs,transformation)`

.

All `fn...`

commands except `fnint`

, `fnder`

, `fndir`

can
handle rational splines.

The commands

runges = rsmak([-5 -5 -5 5 5 5],[1 1 1; 26 -24 26]); rungep = rpmak([-5 5],[0 0 1; 1 -10 26],1);

both provide a description of the rational polynomial *r*(*x*)
= 1/(*x*^{2} + 1) on the
interval [-5 .. 5]. However, outside the interval [-5 .. 5], the function
given by `runges`

is zero, while the rational spline
given by `rungep`

agrees with 1/(*x*^{2} +
1) for every *x*.

The figure of a rotated cone is generated by the commands

fnplt(fncmb(rsmak('cone',1,2),[0 0 -1;0 1 0;1 0 0])) axis equal, axis off, shading interp

**A Rotated Cone Given by a Rational Quadratic
Spline**

A Helix, showing a helix with several windings, is generated by the commands

arc = rsmak('arc',2,[1;-1],[0 7.3*pi]); [knots,c] = fnbrk(arc,'k','c'); helix = rsmak(knots, [c(1:2,:);aveknt(knots,3).*c(3,:); c(3,:)]); fnplt(helix)

**A Helix**

For further illustrated examples, see NURBS and Other Rational Splines