iconEuler Examples

Trefoil Knot

by R. Grothmann

based on a notebook by A. Busser

Trefoil knot in almost tubeplot style (the radius is not quite uniform).

>u:=linspace(-pi,pi,160); v:=linspace(-pi,pi,400)'; ...
 x:=(4*(1+.25*sin(3*v))+cos(u))*cos(2*v); ...
 y:=(4*(1+.25*sin(3*v))+cos(u))*sin(2*v); z=sin(u)+2*cos(3*v); ...
 plot3d(x,y,z,frame=0,scale=1.5,hue=1,light=[1,0,-1],zoom=3.2):

Trefoil Knot

A 3D anaglyph view of this knot.

>plot3d(x,y,z,frame=0,scale=1.5,hue=1,light=[1,0,-1],anaglyph=1,zoom=3.2):

Trefoil Knot

Use red/cyan glasses to view this.

Change the '3's by '5's and you have a 5_1 knot. Surely any torus knot can be obtained this way...

>x:=(4*(1+.4*sin(5*v))+cos(u))*cos(2*v); ...
 y:=(4*(1+.4*sin(5*v))+cos(u))*sin(2*v); z=sin(u)+2*cos(5*v); ...
 plot3d(x,y,z,frame=0,scale=1.5,hue=1,light=[1,0,-1], ...
   zoom=3,anaglyph=1):

Trefoil Knot

Explanation

I try to explain this, and improve the look by making the tube more consistent in radius.

First the curve is a based on the curve with the following coordinates.

>function fx (t) &= 4*(1+sin(3*t)/3)*sin(2*t)
                                  sin(3 t)
                      4 sin(2 t) (-------- + 1)
                                     3

>function fy (t) &= 4*(1+sin(3*t)/3)*cos(2*t)
                                  sin(3 t)
                      4 cos(2 t) (-------- + 1)
                                     3

These curves run twice around the unit circle with a periodic alternation in the radius.

>t=linspace(-pi,pi,400); ...
 plot2d(fx(t),fy(t),r=5):

Trefoil Knot

If we add height to this curve, we get a curve forming a 3D knot.

>function fz(t) &= 2*cos(3*t)
                              2 cos(3 t)

Rotate the figure with the cursor keys to get an impression of the knot. Or press a to generate an anaglyph, if you have red/cyan glasses.

>plot3d(fx(t),fy(t),fz(t),wire=1,>user,zoom=4,<frame, ...
   title=" Press cursor keys, a, space, or return."):

Trefoil Knot

>function f(t) &= [fx(t),fy(t),fz(t)]
                    sin(3 t)                   sin(3 t)
       [4 sin(2 t) (-------- + 1), 4 cos(2 t) (-------- + 1), 
                       3                          3
                                                           2 cos(3 t)]

Next we add a tube to the curve.

Instead of a simple rotation of a circle around the x-axis, we compute the derivative vector of the curve.

>function df(t) &= diff(f(t),t)
                    sin(3 t)
       [8 cos(2 t) (-------- + 1) + 4 sin(2 t) cos(3 t), 
                       3
                                          sin(3 t)
        4 cos(2 t) cos(3 t) - 8 sin(2 t) (-------- + 1), - 6 sin(3 t)]
                                             3

>function w1(t) &= [df(t)[2],-df(t)[1],0]
                                          sin(3 t)
       [4 cos(2 t) cos(3 t) - 8 sin(2 t) (-------- + 1), 
                                             3
                               sin(3 t)
                 - 8 cos(2 t) (-------- + 1) - 4 sin(2 t) cos(3 t), 0]
                                  3

>function w2(t) &= crossproduct(df(t),w1(t));
>function g(s,t,r) &= f(t)+r*(cos(s)*w1(t)/norm(w1(t))+sin(s)*w2(t)/norm(w2(t)));
>function gx(s,t) &= g(s,t,r)[1];
>function gy(s,t) &= g(s,t,r)[2];
>function gz(s,t) &= g(s,t,r)[3];
>s=linspace(pi,-pi,160)';
>r=1;
>fullwindow; plot3d(gx(s,t),gy(s,t),gz(s,t),>hue, ...
    <frame,zoom=5,max=0.7,amb=0):

Trefoil Knot

Using Povray

To be able to run this, you need to install Povray and put it into the program path.

>load povray;
>pov3d(gx(s,t),gy(s,t),gz(s,t),zoom=5,axis=0, ...
   look=povlook(gray,>phong));

Trefoil Knot

The following scene takes quite a while to write and to parse. Please be patient. On my system, it took about 30 seconds.

>pov3d(gx(s,t),gy(s,t),gz(s,t),zoom=5,axis=0, ...
   look=povlook(gray,),>anaglyph);

Trefoil Knot

Let us clean up, since the Povray source code is quite large.

>povclear();

Examples