--Copyright The Numerical Algorithms Group Limited 1994-1996.

-- Create a (p,q) torus-knot with radius r around the curve.
-- The formula was derived by Larry Lambe.

-- To produce a trefoil knot:
--   torusKnot(2, 3, 0.5, 10, 200)

-- compile, don't interpret functions
)set function  compile on

-- read in the numeric generalized tube program
)read ntube

-- Create a (p,q) torus-knot with radius r around the curve.
-- The formula was derived by Larry Lambe.
-- To produce a trefoil knot:
--   torusKnot(2, 3, 0.5)
torusKnot(p:DFLOAT, q:DFLOAT, r:DFLOAT, uSteps:PI, tSteps:PI):VIEW3D ==
  -- equation for the torus knot
  knot := (t:DFLOAT):Point DFLOAT +-> 
    fac := 4/(2.2@DFLOAT-sin(q*t))
    fac * point [cos(p*t), sin(p*t), cos(q*t)]
  -- equation for the cross section of the tube
  circle := (u:DFLOAT, t:DFLOAT):Point DFLOAT +->
    r * point [cos u, sin u]
  -- draw the tube around the knot
  ntubeDrawOpt(knot, circle, 0..2*%pi, 0..2*%pi, var1Steps == uSteps, 
               var2Steps == tSteps)



-- draw a seris of unfolding torus knots

for i in 0..4 repeat torusKnot(2, 2 + i/4, 0.5, 25, 250)
