Parametric Hopf torus
Identify with the unit quaternions and with the unit quaternions with a null -part component. Then the Hopf map is expressed as where the quaternion is obtained from by negating its -th component.
Choose a curve and a lift of , that is a map such that .
For our illustration, we will take the closed curve defined by where is an integer.
The lift is easy to get: simply take
Let’s check:
Ok.
The Hopf cylinder of is then , and we say it’s a Hopf torus when the curve is closed. This is a parametric representation of a Hopf torus.
Here, the integer determines the number of lobes of the Hopf torus, and
the parameter controls the shape.
Now, apply the function and then apply the
stereographic projection.
Below is a R code after we got rid of the quaternions.
h = 0.4
n= 3 # number of lobes
F <- function(t,phi){
p2 <- cos(t) * cos(h * cos(n*t))
p3 <- sin(t) * cos(h * cos(n*t))
p1 <- sin(h * cos(n*t))
## alternatively,
# den = sqrt(1+h^2*cos(n*t)^2);
# p2 = cos(t)/den;
# p3 = sin(t)/den;
# p1 = h*cos(n*t)/den;
##
yden <- sqrt(2*(1+p1))
y1 <- (1+p1)/yden
y2 <- p2/yden
y3 <- p3/yden
cosphi <- cos(phi)
sinphi <- sin(phi)
x1 <- cosphi*y1
x2 <- sinphi*y1
x3 <- cosphi*y2 - sinphi*y3
x4 <- cosphi*y3 + sinphi*y2
return(c(x1/(1-x4), x2/(1-x4), x3/(1-x4)))
}
Now we can use the misc3d
package to plot the projected Hopf torus.
Since I like Asymptote, I also provide the Asymptote code.
settings.render = 4;
settings.outformat="pdf";
size(500,0);
import graph3;
import palette;
real h = 0.4;
real n = 3;
triple F(pair uv){
real t = uv.x;
real phi = uv.y;
real p2 = cos(t) * cos(h * cos(n*t));
real p3 = sin(t) * cos(h * cos(n*t));
real p1 = sin(h * cos(n*t));
real yden = sqrt(2*(1+p1));
real y1 = (1+p1)/yden;
real y2 = p2/yden;
real y3 = p3/yden;
real cosphi = cos(phi);
real sinphi = sin(phi);
real x1 = cosphi*y1;
real x2 = sinphi*y1;
real x3 = cosphi*y2 - sinphi*y3;
real x4 = cosphi*y3 + sinphi*y2;
return (x1/(1-x4), x2/(1-x4), x3/(1-x4));
}
splinetype[] Notaknot={notaknot,notaknot,notaknot};
surface s=surface(F,(0,0),(2pi,2*pi),116,116,Notaknot,Notaknot);
s.colors(palette(s.map(abs),Gradient(8192,yellow,green)));
draw(rotate(-20,(0,1,0))*rotate(-45,(0,0,1))*rotate(90,(1,0,0))*s);
And I also like three.js
: