KnotsWritten by Paul BourkeOctober 1992 The following describes a few parametric functions in 3 dimensions which give the appearance of knots in a piece of string. Knot 1 ![]()
Knot 2 ![]() This is a special case of the more general torus knot described in knot 3. Knot 3 This is an example of a torus knot which exists on the surface a torus. It is characterised by the number of time it wraps around the meridian and longitudinal axis of a torus. ![]()
![]()
![]()
Knot 4 There are a whole family of curves including knots which are formed by the equations:
x = r * cos(phi) * cos(theta) which are the equations for converting from polar to Cartesian coordinates except that we make r, theta, phi a function of a parameter beta which ranges from 0 to pi. For the following
r(beta) = 0.8 + 1.6 * sin(6 * beta)
![]() Knot 5 Using the same systems of equations as in knot 4, with
r(beta) = 1.2 * 0.6 * sin(0.5 * pi + 6 * beta)
![]() C Source for Knot 1
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define TWOPI 6.283185307179586476925287
#define NSEGMENTS 1000
#define RADIUS .50
int main(argc,argv)
int argc;
char **argv;
{
int i;
double x,y,z,xlast,ylast,zlast;
double mu;
for (i=0;i<=NSEGMENTS;i++) {
mu = i * TWOPI / (double)NSEGMENTS;
x = 10 * (cos(mu) + cos(3*mu)) + cos(2*mu) + cos(4*mu);
y = 6 * sin(mu) + 10 * sin(3*mu);
z = 4 * sin(3*mu) * sin(5*mu/2) + 4*sin(4*mu) - 2 * sin(6*mu);
/*
Write the geometry in any format you like
Here I create sphere and cylinder combinations for Radiance
*/
if (i < NSEGMENTS)
printf("surf sphere s%d\n0 0 4 %g %g %g %g\n",i,x,y,z,RADIUS);
if (i != 0)
printf("surf cylinder c%d\n 0 0 7 %g %g %g %g %g %g %g\n",
i,xlast,ylast,zlast,x,y,z,RADIUS);
xlast = x;
ylast = y;
zlast = z;
}
}
C Source for Knot 2
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define PI 3.141592653589793238462643
#define TWOPI 6.283185307179586476925287
#define NSEGMENTS 1000
#define RADIUS 0.1
int main(argc,argv)
int argc;
char **argv;
{
int i;
double x,y,z,xlast,ylast,zlast;
double mu;
for (i=0;i<=NSEGMENTS;i++) {
mu = i * TWOPI / (double)NSEGMENTS;
x = (4 * cos(mu + PI)) / 3 + 2 * cos(3 * mu);
y = 4 * sin(mu) / 3 + 2 * sin(3 * mu);
z = sin(4 * mu) + sin(2 * mu) / 2;
if (i < NSEGMENTS)
printf("surf sphere s%d\n0 0 4 %g %g %g %g\n",i,x,y,z,RADIUS);
if (i != 0)
printf("surf cylinder c%d\n 0 0 7 %g %g %g %g %g %g %g\n",
i,xlast,ylast,zlast,x,y,z,RADIUS);
xlast = x;
ylast = y;
zlast = z;
}
}
C Source for Knot 3
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define TWOPI 6.283185307179586476925287
#define NSEGMENTS 1000
#define RADIUS 0.05
int main(argc,argv)
int argc;
char **argv;
{
int i;
double x,y,z,xlast,ylast,zlast;
double mu;
int nlongitude,nmeridian;
nmeridian = atoi(argv[1]);
nlongitude = atoi(argv[2]);
for (i=0;i<=NSEGMENTS;i++) {
mu = i * TWOPI * nmeridian / (double)NSEGMENTS;
x = cos(mu) * (1 + cos(nlongitude*mu/(double)nmeridian) / 2.0);
y = sin(mu) * (1 + cos(nlongitude*mu/(double)nmeridian) / 2.0);
z = sin(nlongitude*mu/(double)nmeridian) / 2.0;
if (i < NSEGMENTS)
printf("surf sphere s%d\n0 0 4 %g %g %g %g\n",i,x,y,z,RADIUS);
if (i != 0)
printf("surf cylinder c%d\n 0 0 7 %g %g %g %g %g %g %g\n",
i,xlast,ylast,zlast,x,y,z,RADIUS);
xlast = x;
ylast = y;
zlast = z;
}
}
Eight KnotBy Paul BourkeJanuary 2001
x = 10 (cos(t) + cos(3 t)) + cos(2 t) + cos(4 t)
![]()
![]()
![]()
Knot in Second Life
Cinquefoil KnotGraphics by Paul BourkeNovember 2004
x = cos(u) [ 2 - cos(2 u/(2 k + 1)) ]
k=1, see Trefoil Knot.
k=2 ![]()
![]()
![]()
k=3 ![]()
![]()
![]()
Trefoil KnotGraphics by Paul BourkeNovember 2004
x = 41 cos(u) - 18 sin(u) - 83 cos(2 u) - 83 sin(2 u) - 11 cos(3 u) + 27 sin(3 u)
![]()
![]()
![]()
Granny KnotGraphics by Paul BourkeNovember 2004
x = -22 cos(u) - 128 sin(u) - 44 cos(3 u) - 78 sin(3 u)
![]()
![]()
![]()
![]()
Second Life
3D printed
|