How to plot a lattice of points on the surface of a torus?
Edit A bug fixed (the outer equator midpoints was not calculated correctly, as pointed out by @Dror).
MWE
with Asymptote
, file lattice.asy
:
size(200);
import graph3;
pen surfPen=rgb(1,0.7,0);
pen xarcPen=deepblue+0.7bp;
pen yarcPen=deepred+0.7bp;
currentprojection=perspective(5,4,4);
real R=2;
real a=1;
triple fs(pair t) {
return ((R+a*Cos(t.y))*Cos(t.x),(R+a*Cos(t.y))*Sin(t.x),a*Sin(t.y));
}
surface s=surface(fs,(0,0),(360,360),8,8,Spline);
draw(s,surfPen,render(compression=Low,merge=true));
int m=20;
int n=10;
real arcFactor=0.85;
pair p,q,v;
for(int i=1;i<=n;++i){
for(int j=0;j<m;++j){
p=(j*360/m,(i%n)*360/n);
q=(((j+arcFactor)%m)*360/m,i*360/n);
v=(((j+arcFactor/2)%m)*360/m,i*360/n);
draw(fs(p)..fs(v)..fs(q),xarcPen,Arrow3(size=4));
q=(j*360/m,((i%n)-arcFactor)*360/n);
draw(fs(p)..fs((p+q)/2)..fs(q),yarcPen,Arrow3(size=3));
dot(fs(p));
}
}
Compile with asy -f pdf -noprc -render=4 lattice.asy
to get a standalone lattice.pdf
.
Are you thinking about something like this?
\documentclass{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}[width=10cm,height=10cm]
import graph3;
import three;
size3(200);
currentprojection=orthographic(3,3,5);
currentlight=light(gray(0.4),specularfactor=3,viewport=true,
(-0.5,-0.25,0.45),(0.5,-0.5,0.5),(0.5,0.5,0.75));
int nb = 20, ns = 10;
real rb = 5.0, rs = 2.0;
triple torus(pair z) {
return ((rb + rs*cos(2*pi*z.x/ns))*cos(2*pi*z.y/nb),
(rb + rs*cos(2*pi*z.x/ns))*sin(2*pi*z.y/nb),
rs*sin(2*pi*z.x/ns));
}
surface site = scale3(0.1)*unitsphere;
for(int k1=0; k1<ns; ++k1) {
for(int k2=0; k2<nb; ++k2) {
draw(surface(torus((k1,k2))--torus((k1+1,k2))--torus((k1+1,k2+1))--torus((k1,k2+1))--cycle),
lightgray);
draw(torus((k1,k2))--torus((k1+1,k2)),Arrow3);
draw(torus((k1,k2))--torus((k1,k2+1)),Arrow3);
draw(shift(torus((k1,k2)))*site,red);
}
}
\end{asy}
\end{document}
It's made with Asymptote.