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,
draws planeCurve in the normal planes of spaceCurve.
The parameter specifies
the parameter range for planeCurve
and 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 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 into the normal plane