/usr/share/axiom-20170501/src/algebra/EXPRTUBE.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | )abbrev package EXPRTUBE ExpressionTubePlot
++ Author: Clifton J. Williamson
++ Date Created: Bastille Day 1989
++ Date Last Updated: 5 June 1990
++ Description:
++ Package for constructing tubes around 3-dimensional parametric curves.
ExpressionTubePlot() : SIG == CODE where
B ==> Boolean
I ==> Integer
FE ==> Expression Integer
SY ==> Symbol
SF ==> DoubleFloat
L ==> List
S ==> String
SEG ==> Segment
F2F ==> MakeFloatCompiledFunction(FE)
Pt ==> Point SF
PLOT3 ==> Plot3D
TUBE ==> TubePlot Plot3D
SIG ==> with
constantToUnaryFunction : SF -> (SF -> SF)
++ constantToUnaryFunction(s) is a local function which takes the
++ value of s, which may be a function of a constant, and returns
++ a function which always returns the value \spadtype{DoubleFloat} s.
tubePlot : (FE,FE,FE,SF -> SF,SEG SF,SF -> SF,I) -> TUBE
++ tubePlot(f,g,h,colorFcn,a..b,r,n) puts a tube of radius r(t) with
++ n points on each circle about the curve \spad{x = f(t)},
++ \spad{y = g(t)}, \spad{z = h(t)} for t in \spad{[a,b]}.
++ The tube is considered to be open.
tubePlot : (FE,FE,FE,SF -> SF,SEG SF,SF -> SF,I,S) -> TUBE
++ tubePlot(f,g,h,colorFcn,a..b,r,n,s) puts a tube of radius \spad{r(t)}
++ with n points on each circle about the curve \spad{x = f(t)},
++ \spad{y = g(t)},
++ \spad{z = h(t)} for t in \spad{[a,b]}. If s = "closed", the tube is
++ considered to be closed; if s = "open", the tube is considered
++ to be open.
tubePlot : (FE,FE,FE,SF -> SF,SEG SF,SF,I) -> TUBE
++ tubePlot(f,g,h,colorFcn,a..b,r,n) puts a tube of radius r with
++ n points on each circle about the curve \spad{x = f(t)},
++ \spad{y = g(t)}, \spad{z = h(t)} for t in \spad{[a,b]}.
++ The tube is considered to be open.
tubePlot : (FE,FE,FE,SF -> SF,SEG SF,SF,I,S) -> TUBE
++ tubePlot(f,g,h,colorFcn,a..b,r,n,s) puts a tube of radius r with
++ n points on each circle about the curve \spad{x = f(t)},
++ \spad{y = g(t)}, \spad{z = h(t)} for t in \spad{[a,b]}.
++ If s = "closed", the tube is
++ considered to be closed; if s = "open", the tube is considered
++ to be open.
CODE ==> add
import Plot3D
import F2F
import TubePlotTools
--% variables
getVariable: (FE,FE,FE) -> SY
getVariable(x,y,z) ==
varList1 := variables x
varList2 := variables y
varList3 := variables z
(not (# varList1 <= 1)) or (not (# varList2 <= 1)) or _
(not (# varList3 <= 1)) =>
error "tubePlot: only one variable may be used"
null varList1 =>
null varList2 =>
null varList3 =>
error "tubePlot: a variable must appear in functions"
first varList3
t2 := first varList2
null varList3 => t2
not (first varList3 = t2) =>
error "tubePlot: only one variable may be used"
t1 := first varList1
null varList2 =>
null varList3 => t1
not (first varList3 = t1) =>
error "tubePlot: only one variable may be used"
t1
t2 := first varList2
null varList3 =>
not (t1 = t2) =>
error "tubePlot: only one variable may be used"
t1
not (first varList3 = t1) or not (t2 = t1) =>
error "tubePlot: only one variable may be used"
t1
--% tubes: variable radius
tubePlot(x:FE,y:FE,z:FE,colorFcn:SF -> SF,_
tRange:SEG SF,radFcn:SF -> SF,n:I,string:S) ==
-- check value of n
n < 3 => error "tubePlot: n should be at least 3"
-- check string
flag : B :=
string = "closed" => true
string = "open" => false
error "tubePlot: last argument should be open or closed"
-- check variables
t := getVariable(x,y,z)
-- coordinate functions
xFunc := makeFloatFunction(x,t)
yFunc := makeFloatFunction(y,t)
zFunc := makeFloatFunction(z,t)
-- derivatives of coordinate functions
xp := differentiate(x,t)
yp := differentiate(y,t)
zp := differentiate(z,t)
-- derivative of arc length
sp := sqrt(xp ** 2 + yp ** 2 + zp ** 2)
-- coordinates of unit tangent vector
Tx := xp/sp; Ty := yp/sp; Tz := zp/sp
-- derivatives of coordinates of unit tangent vector
Txp := differentiate(Tx,t)
Typ := differentiate(Ty,t)
Tzp := differentiate(Tz,t)
-- K = curvature = length of curvature vector
K := sqrt(Txp ** 2 + Typ ** 2 + Tzp ** 2)
-- coordinates of principal normal vector
Nx := Txp / K; Ny := Typ / K; Nz := Tzp / K
-- functions SF->SF giving coordinates of principal normal vector
NxFunc := makeFloatFunction(Nx,t);
NyFunc := makeFloatFunction(Ny,t);
NzFunc := makeFloatFunction(Nz,t);
-- coordinates of binormal vector
Bx := Ty * Nz - Tz * Ny
By := Tz * Nx - Tx * Nz
Bz := Tx * Ny - Ty * Nx
-- functions SF -> SF giving coordinates of binormal vector
BxFunc := makeFloatFunction(Bx,t);
ByFunc := makeFloatFunction(By,t);
BzFunc := makeFloatFunction(Bz,t);
-- create Plot3D
parPlot := plot(xFunc,yFunc,zFunc,colorFcn,tRange)
tvals := first tValues parPlot
curvePts := first listBranches parPlot
cosSin := cosSinInfo n
loopList : L L Pt := nil()
while not null tvals repeat
-- note that tvals and curvePts have the same number of elements
tval := first tvals; tvals := rest tvals
ctr := first curvePts; curvePts := rest curvePts
pNormList : L SF :=
[NxFunc tval,NyFunc tval,NzFunc tval,colorFcn tval]
pNorm : Pt := point pNormList
bNormList : L SF :=
[BxFunc tval,ByFunc tval,BzFunc tval,colorFcn tval]
bNorm : Pt := point bNormList
lps := loopPoints(ctr,pNorm,bNorm,radFcn tval,cosSin)
loopList := cons(lps,loopList)
tube(parPlot,reverse_! loopList,flag)
tubePlot(x:FE,y:FE,z:FE,colorFcn:SF -> SF,_
tRange:SEG SF,radFcn:SF -> SF,n:I) ==
tubePlot(x,y,z,colorFcn,tRange,radFcn,n,"open")
--% tubes: constant radius
project: (SF,SF) -> SF
project(x,y) == x
constantToUnaryFunction x == s +-> project(x,s)
tubePlot(x:FE,y:FE,z:FE,colorFcn:SF -> SF,_
tRange:SEG SF,rad:SF,n:I,s:S) ==
tubePlot(x,y,z,colorFcn,tRange,constantToUnaryFunction rad,n,s)
tubePlot(x:FE,y:FE,z:FE,colorFcn:SF -> SF,_
tRange:SEG SF,rad:SF,n:I) ==
tubePlot(x,y,z,colorFcn,tRange,rad,n,"open")
|