# 21.10 ntube.input¶

The functions in this file create generalized tubes (also known as generalized cylinders). These functions draw a 2-d curve in the normal planes around a 3-d curve.

R3 := Point DFLOAT                                         Points in 3-Space

R2 := Point DFLOAT                                         Points in 2-Space
S := Segment Float                                         Draw ranges

Introduce types for functions for:

ThreeCurve := DFLOAT -> R3                                 –the space curve function

TwoCurve := (DFLOAT, DFLOAT) -> R2                         –the plane curve function

Surface := (DFLOAT, DFLOAT) -> R3                          –the surface function

Frenet frames define a

FrenetFrame :=                                             coordinate system around a
Record(value:R3,tangent:R3,normal:R3,binormal:R3)

point on a space curve

frame: FrenetFrame                                         The current Frenet frame

for a point on a curve

ntubeDraw(spaceCurve, planeCurve, u0..u1, t0..t1) draws planeCurve in

the normal planes of spaceCurve. The parameter u0..u1 specifies the parameter range for planeCurve and t0..t1 specifies the parameter range for spaceCurve. Additionally, the plane curve function takes a second parameter: the current parameter of spaceCurve. This allows the plane curve to change shape as it goes around the space curve. See ugFimagesFive for an example of this.

ntubeDraw: (ThreeCurve,TwoCurve,S,S) -> VIEW3D
ntubeDraw(spaceCurve,planeCurve,uRange,tRange) ==
ntubeDrawOpt(spaceCurve, planeCurve, uRange, _
tRange, []$List DROPT) ntubeDrawOpt: (ThreeCurve,TwoCurve,S,S,List DROPT) -> VIEW3D ntubeDrawOpt(spaceCurve,planeCurve,uRange,tRange,l) ==  This function is similar to ntubeDraw, but takes delT:DFLOAT := (hi(tRange) - lo(tRange))/10000 optional parameters that it oldT:DFLOAT := lo(tRange) - 1 passes to the draw command fun := ngeneralTube(spaceCurve,planeCurve,delT,oldT) draw(fun, uRange, tRange, l) nfrenetFrame(c, t, delT) numerically computes the Frenet frame about the curve c at t. Parameter delT is a small number used to compute derivatives. nfrenetFrame(c, t, delT) == f0 := c(t) f1 := c(t+delT) t0 := f1 - f0 The tangent n0 := f1 + f0 b := cross(t0, n0) The binormal n := cross(b,t0) The normal ln := length n lb := length b ln = 0 or lb = 0 => error "Frenet Frame not well defined"  n := (1/ln)*n Make into unit length vectors b := (1/lb)*b [f0, t0, n, b]$FrenetFrame

ngeneralTube(spaceCurve, planeCurve, delT, oltT) creates a function

that can be passed to the system axiomFun{draw} command. The function is a parameterized surface for the general tube around spaceCurve. delT is a small number used to compute derivatives. oldT is used to hold the current value of the t parameter for spaceCurve. This is an efficiency measure to ensure that frames are only computed once for each value of t.

ngeneralTube: (ThreeCurve, TwoCurve, DFLOAT, DFLOAT) -> Surface
ngeneralTube(spaceCurve, planeCurve, delT, oldT) ==

free frame                                               Indicate that frame is global
(v:DFLOAT, t: DFLOAT): R3 +->

if (t $\sim$= oldT) then                               If not already computed

frame := nfrenetFrame(spaceCurve, t, delT)           compute new frame
oldT := t p := planeCurve(v, t) frame.value + p.1*frame.normal + p.2*frame.binormal

Project p into the normal plane