11

I need to draw a couple of interlocking tori, as in the picture, using Tikz.

Interlocking Tori

I've been looking at some examples online and all I find is instructions to do it with Gnuplot, nothing about Tikz. If anyone could help I would deeply appreciate it.

3 Answers3

14

You can plot 4 half tori like this :

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\pgfplotsset{
  torus/.style 2 args={
    surf,
    color=#1!50,faceted color=#1,
    samples=17,
    z buffer=sort,
    domain=0:360, y domain=#2:#2+180
  }
}
\def\m{sin(x)}
\def\n{(2+cos(x))*sin(y)}
\def\p{(2+cos(x))*cos(y)}

\begin{document}
  \begin{tikzpicture}
      \begin{axis}[hide axis,axis equal,scale=3,view={20}{20}]
        \addplot3[torus={blue}{0}] (\m,\n,\p);
        \addplot3[torus={red}{0}] (\p,\n-2,\m);
        \addplot3[torus={blue}{180}] (\m,\n,\p);
        \addplot3[torus={red}{180}] (\p,\n-2,\m);
      \end{axis}
  \end{tikzpicture}
\end{document}

enter image description here

Kpym
  • 23,002
  • 1
    To make the tori look "circular" rather than "elliptic", you can use the unit vector ratio=1 1 1 option or axis equal. – Tom Bombadil Nov 28 '15 at 23:46
7

Run with xelatex:

\documentclass[pstricks]{standalone}
\usepackage{pst-solides3d}
\begin{document}

\psset{Decran=50,viewpoint=20 80 30,lightsrc=viewpoint,action=none}
 \begin{pspicture}[solidmemory](-4,-3)(3,3)
    \psSolid[r1=2.5,r0=1.5,object=tore,ngrid=18 36,fillcolor=green!30,name=tA]
    \psSolid[r1=2.5,r0=1.5,object=tore,ngrid=18 36,fillcolor=blue!30,RotX=90,name=tB](2,0,0) 
    \psSolid[object=fusion,base=tA tB,action=draw**]
\end{pspicture}

\end{document}

enter image description here

4

A bit late to the party, but here's a solution using asymptote.

/*  Used for rendering parameterized 3D objects.                              */
import graph3;

/* PDF works best with LaTeX, output this. Also set the render factor high. */ import settings; settings.outformat = "pdf"; settings.render = 8;

/* Size of the image. For 3D objects it seems best to have this set to a *

  • power of 2, otherwise weird vertical or horizontal black lines may appear.*/

size(256);

/* How the image is being drawn on a 2D picture. */ currentprojection = perspective(5.0, 4.0, 4.0);

/* Two radii defining the torus. */ real R = 3.0; real a = 1.3;

/* Material the two torii are made of. / material blueblob = material( diffusepen = blue + 0.25green, emissivepen = gray(0.2), specularpen = gray(0.2) );

material redblob = material( diffusepen = red, emissivepen = gray(0.2), specularpen = gray(0.2) );

/* Function for drawing the torus. / triple torus_parameterization(pair t) { / The parameterization is in terms of sine and cosine of 2 pi t.x and * * 2 pi t.y. Precompute these to avoid repetitive calculations. / real u = 2.0pit.x; real v = 2.0pi*t.y; real cosu = cos(u); real cosv = cos(v); real sinu = sin(u); real sinv = sin(v);

/*  Given the two angles u and v, the x, y, and z coordinates are:        */
real x = (R + a*cosv)*cosu;
real y = (R + a*cosv)*sinu;
real z = a*sinv;

/*  Return the point (x, y, z), which is a point on the surface.          */
triple out = (x, y, z);
return out;

} /* End of torus_parameterization. */

/* Create the first torus. */ surface t0 = surface(torus_parameterization, (0.0, 0.0), (1.0, 1.0), Spline);

/* The second torus is obtained by rotating and shifting. / surface t1 = shift((R, 0.0, 0.0))(rotate(90.0, (1.0, 0.0, 0.0))*t0);

/* Draw both of the torii. */ draw(t0, surfacepen = redblob, render(merge=true)); draw(t1, surfacepen = blueblob, render(merge=true));

enter image description here