This is a simple demonstrational notebook dealing with construction of a surface created by revolving a point around a space curve.

Here x(t) and z(t) define a trefoil-shaped line in Oxz plane and y(t) is adjusted so as to make the space curve knotted.

\(x[t_] = 3\ Sin[2\ t] - \ Sin[t]; 
y[t_] = h\ Sin[3  t]; 

    z[t_] = 3\ Cos[2\ t] + Cos[t]; \)

Now the idea is to make a coordinate system with basis vectors (Overscript[t, ⇀]), (Overscript[n, ⇀]), 
      (Overscript[b, ⇀]), such that (Overscript[t, ⇀]) is tangent to our curve and the other two are normal. Then, we draw a circle in this coordinate system and calculate the coordinates of its points in Oxyz system.

All tangent vectors to the curve (at a fixed point) are parallel but we can choose normals in different ways, for example \(TraditionalForm
      \`n\&⇀ = {z' \((t)\), 0, \(-x'\) \((t)\)}\) is normal to the curve. But we will choose the system based on the so-called natural parameter

s = 
              (Overscript[((∫_((Subscript[t, 0])))), t]) | 
                  (Overscript[r,  ⇀]) ' (t) | dt,

where (Overscript[r, ⇀])(t) = {x(t), y(t), z(t)}. If we define our curve via parameter s, we'll get

(Overscript[t, ⇀]) = (Overscript[r, ⇀])' (s) — tangent vector,
 \(TraditionalForm
      \`n\&⇀ = \(r\&⇀'\)' \((s)\)\) — normal vector,
 \(TraditionalForm
      \`b\&⇀ = \([t\&⇀, n\&⇀]\)\) — another normal vector (cross product),

and (Overscript[t, ⇀]), (Overscript[n, ⇀]), 
      (Overscript[b, ⇀])  will form an orthogonal basis. We have

(Overscript[r,  ⇀]) ' (s) = 
            (((Overscript[r,  ⇀]) ' (t))/(s' (t))) = 
              (((Overscript[r,  ⇀]) ' (t))/( | 
                  (Overscript[r,  ⇀]) ' (t) | 
                    ))

(we can omit \(TraditionalForm
      \`\(|\( r\&⇀' \((t)\) 
        | \)\)\)  because we'll normalize all three vector together later), and  (Overscript[r, ⇀])'' (s) is calculated in the similar way (the details are omitted here).

\(rv[t_] = {x[t], y[t], z[t]}; 
tv[t_] = \(rv'\)[t]; 

    nv[t_] = \(\(rv'\)'\)[t] \((\(rv'\)[t] . \(rv'\)[t])\) - 

        							\ \(rv'\)[t] \((\(rv'\)[t] . \(\(rv'\)'\)[t])\); 

    bv[t_] = tv[t]\[Cross]nv[t]; \)

Now, the matrix consisting of coordinates of the basis vectors of one system in another system is the transition matrix between these two systems. We are normalizing (Overscript[t, ⇀]), (Overscript[n, ⇀]), 
      (Overscript[b, ⇀])  first and, because we need to convert the coordinates  from  (Overscript[t, ⇀]), (Overscript[n, ⇀]), 
      (Overscript[b, ⇀])  basis (in which we will define a circle), we should take the inverse matrix. Our matrix is Hermitian, i.e. (A^T) = (A^(-1))  (it follows from the fact that the components of the matrix are cosines of angles between the vectors of the first and of the second basis, provided that both bases are orthonormal).

\(\(A[t_] = Transpose[\(#\/\@\(# . #\)&\)\ /@\ {tv[t], nv[t], bv[t]}]; 
    \)\)

Finally, we define a circle in the (Overscript[n, ⇀]), (Overscript[b, ⇀]) plane, rotate it and move so that its center moves to the point on the curve.

(({{ξ[u_, v_]}, {ζ[u_, v_]}, {η[u_, v_]}}))=A[u].(({{0}, {r Cos[v]}, {r Sin[v]}}))+(({{x[u]}, {y[u]}, {z[u]}}));

Evaluate the next cell to see the graphic.

\(\(Block[
	{h = 1.0, r = 0.67}, 
	
      ParametricPlot3D[
		
        Evaluate[{ξ[u, v], ζ[u, v], η[u, v]}], 

        		{u, 0, 2  π}, {v, 0, 2  π}, 
		PlotPoints -> {90, 15}, 
        
		Axes -> False, Boxed -> False]]; \)\)

Such a 'tube' can be drawn by other methods, which are faster to compute. Also, our approach suffers from some problems like very rapid changing of (Overscript[t, ⇀]), (Overscript[n, ⇀]), 
      (Overscript[b, ⇀]) as functions of t. But it is a very general way which allows us to define more complex surfaces:

(({{ξ[u_, v_]}, {ζ[u_, v_]}, {η[u_, v_]}}))=A[u].(({{δ v}, {r Cos[ω u]}, {r Sin[ω u]}}))+(({{x[u]}, {y[u]}, {z[u]}}));

Evaluate the next cell to see the graphic.

\(\(Block[
	{h = 1.0, r = 0.67, ω = 100.0, δ = 0.05}, 
	
      ParametricPlot3D[
		
        Evaluate[{ξ[u, v], ζ[u, v], η[u, v]}], 

        		{u, 0, 2  π}, {v, \(-1\), 1}, 
		PlotPoints -> {1000, 2}, 
        
		Axes -> False, Boxed -> False]]; \)\)

Copyright © 1998, Maxim Rytin