How to plot a lattice of points on the surface of a torus?

I am doing a report on the Ising model, without going into the complex details of the model, in its two-dimensional form it involves a lattice of points. Which, when periodic boundary conditions are imposed can be though of as on a torus.

For clarification, what I mean by "periodic boundary conditions" is that the right neighbour to a point in the far right column is a point in the far left column in the same row, and the bottom neighbour to a point in the bottom row is a point in the top row in the same column. Therefore, what I want to do is plot a grid on a torus, and place dots on that grid.

I also eventually want to place arrows going from one point to the next on the torus, as I did here for the lattice: I'm just having a lot of trouble trying to put it all together. How can this be achieved with Tikz? If not with Tikz, then how can be achieved at all?

I've done a fair bit of research on drawing a torus:

And a few other things:

And if it helps, here is the source code to the drawings I made in this post:

\begin{tikzpicture}
\clip (-1,-1) rectangle (6cm,6cm);
\draw[style=help lines,thick] (0,0) grid[step=.5cm] (5,5);

\foreach \x in {0,1,...,10}
{
\foreach \y in {0,1,...,10}
{
\node[draw,circle,inner sep=2pt,fill] at (.5*\x,.5*\y) {};
}
}
\end{tikzpicture}

and...

\begin{tikzpicture}
\clip (-1,-1) rectangle (6cm,6cm);

\foreach \x in {0,1,...,10}
{
\foreach \y in {10,9,...,0}
{
\node[draw,circle,inner sep=1pt,fill] at (.5*\x,.5*\y) {};
\draw[thick,->] (.5*\x,.5*\y) -- (.5*\x+.4,.5*\y);
\draw[thick,->] (.5*\x,.5*\y) -- (.5*\x,.5*\y-.4);
}
}
\end{tikzpicture}

My only request is that graphics created in non-LaTeX applications like InkScape, Blender, etc not be suggested.

• I think you really want to look into Asymptote for these kinds of 3D diagrams. – Jake Dec 5 '13 at 14:04
• Mathematica is the best choice. – kiss my armpit Dec 5 '13 at 14:37
• @DonutE.Knot I don't have access to Mathematica, nor the money to purchase it. – NictraSavios Dec 5 '13 at 14:42
• @DonutE.Knot Student + Thesis + Broken Laptop + New Apartment = not happening. Anyway, this is off topic. If you'd like to continue, we should do so in chat. – NictraSavios Dec 5 '13 at 14:49
• @DonutE.Knot I've been using Mathematica since version 3 and used to be a fan of it. However, for serious computations it is to slow and memory hungry. Graphics look nice on screen, but if you export they are huge or crap. – Alex Dec 5 '13 at 17:43 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.

• It looks great, the only reason I choose the other answer is because it looks more "scientific". – NictraSavios Dec 5 '13 at 19:36
• I get this mess when I render yours: s30.postimg.org/rijii354x/Page_1_torus_latice.jpg – NictraSavios Dec 6 '13 at 2:46
• @NictraSavios: The command should be asy -f pdf -noprc -render=4 lattice.asy as noted. – g.kov Dec 6 '13 at 5:52
• Got it, I wasn't using the render command because it errored on my machine. Turns out Ubuntu's in-repository package doesn't support it, so I compiled from source and it worked. See here: tex.stackexchange.com/questions/148622/… – NictraSavios Dec 7 '13 at 13:42
• Very nice solution! Is there some artifact along the (outer) equator of the torus? – Dror Dec 11 '13 at 7:22

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.

• What sorcery is this! It's... it's beautiful... if it weren't free, I'd force the developers to take my money. Heck, I'll do it anyway! "Give me a donate button for I'll show up at your house" I say! Thank you! – NictraSavios Dec 5 '13 at 15:37
• Really nice! Would it be very complicated to use round surfaces instead of planar ones (i.e. circular arcs for the arrows instead of straight lines)? – Jake Dec 5 '13 at 15:39
• Can it do 2D graphics as well? – NictraSavios Dec 5 '13 at 15:41
• @Jake No, it's not complicated, have a look at the gallery. – Alex Dec 5 '13 at 15:49
• I know, but I can't figure out how. The documentation isn't that good and not well indexed. – NictraSavios Dec 5 '13 at 19:34