Draw Double Torus using Tikz and pgfplots in LaTeX – An attempt

Hello, in this tutorial, we will learn how to draw or plot double torus in LaTeX using Tikz and pgfplots. A double torus is also known as gen 2 torus or genus 2 torus.

I have done a lot of work in LaTeX, but till now this is the hardest task that I ever did in LaTeX. It might look easier but it is not.

I first tried to draw a single torus and then somehow managed to draw a double torus. (Like two torus in a single frame, but that was not enough)

You can check my previous tutorial: Draw Torus with Tikz in LaTeX  with Equation

Double torus in LaTeX

After trying a lot of attempts I came to this point.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepgfplotslibrary{colormaps}

\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        width=15cm, 
        height=15cm, 
        view={45}{45}, 
        hide axis, 
        samples=40, 
        samples y=40, 
        domain=0:360,
        y domain=0:360,
        z buffer=sort, % Improve 3D rendering
        colormap/viridis, % Set the colormap
        axis equal % Keep the proportions correct
    ]
        % First torus (placed on the left)
        \addplot3[
            surf,
            shader=flat,
            opacity=0.8, % Add some transparency
            mesh/rows=40, % Match the number of samples
            mesh/cols=40 % Match the number of samples y
        ]
        (
            {(2 + cos(x)) * cos(y)}, 
            {(2 + cos(x)) * sin(y)}, 
            {sin(x)}
        );

        % Second torus, placed side by side (translated along the x-axis)
        \addplot3[
            surf,
            shader=flat,
            opacity=0.8, % Add some transparency
            mesh/rows=40, % Match the number of samples
            mesh/cols=40, % Match the number of samples y
            domain=0:360, 
            y domain=0:360
        ]
        (
            {(2 + cos(x)) * cos(y) + 5},  % Shifted by +5 units along the x-axis
            {(2 + cos(x)) * sin(y)}, 
            {sin(x)}
        );
    \end{axis}
\end{tikzpicture}

\end{document}

Output:

latex double torus

But this is not what is our expectation right?

We need to change the position slightly and blend the intersection position. So in my next attempt I did this:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepgfplotslibrary{colormaps}

\begin{document}

\begin{tikzpicture}
    \begin{axis}[
        width=15cm, % Increase the width of the plot
        height=15cm, % Increase the height of the plot
        view={45}{45}, % Adjust the viewing angle for better visualization
        hide axis, % Hide the axes
        samples=40, % Number of samples in the x direction
        samples y=40, % Number of samples in the y direction
        domain=0:360,
        y domain=0:360,
        z buffer=sort, % Improve 3D rendering
        colormap/viridis, % Set the colormap
        axis equal % Keep the proportions correct
    ]
        % First torus (placed on the left)
        \addplot3[
            surf,
            shader=flat,
            opacity=0.8, % Add some transparency to blend the intersection
            mesh/rows=40, % Match the number of samples
            mesh/cols=40 % Match the number of samples y
        ]
        (
            {(2 + cos(x)) * cos(y)}, 
            {(2 + cos(x)) * sin(y)}, 
            {sin(x)}
        );

        % Second torus, intersecting the first one
        \addplot3[
            surf,
            shader=flat,
            opacity=0.8, % Add some transparency to blend the intersection
            mesh/rows=40, % Match the number of samples
            mesh/cols=40, % Match the number of samples y
            domain=0:360, 
            y domain=0:360
        ]
        (
            {(2 + cos(x)) * cos(y) + 4},  % Shifted by +4 units along the x-axis
            {(2 + cos(x)) * sin(y)}, 
            {sin(x)}
        );
    \end{axis}
\end{tikzpicture}

\end{document}

Output:

double torus in Latex

You just need to change the viewing angle and distance in between these torus to get your desired result.

Leave a Reply

Your email address will not be published. Required fields are marked *