5

Is it possible to define a new command in TikZ which will use the same arguments as the \path [line] (node1) -- (node2); command, but which draws instead a 3D tube?

cfr
  • 198,882
user2536125
  • 1,165

1 Answers1

10

Here's a verdion that draws many lines. You specify the maximum width, the number of lines to draw, the inner and outer color and the path definition. Furthermore it is possible to supply further options.

The width of the lines increses in such a way that it gives the illusion of looking on a tube from the top. a very small number of lines (e.g. 3) will look quite bad, while a ver high number (e.g. 25) does not add to much. If you specify a path, intersections will look merged. If you want to achieve a look of paths running "over" and "under" each other, you'll have to break up the path.

Code

\documentclass[tikz, border=2mm]{standalone}

\begin{document}

\newcommand{\Tube}[6][]%
% [further options], width, iterations, inner color, outer color, path definition
{   \colorlet{InColor}{#4}
    \colorlet{OutColor}{#5}
    \foreach \I in {1,...,#3}
    {   \pgfmathsetlengthmacro{\h}{(\I-1)/#3*#2}
        \pgfmathsetlengthmacro{\r}{sqrt(pow(#2,2)-pow(\h,2))}
        \pgfmathsetmacro{\c}{(\I-0.5)/#3*100}
        \draw[InColor!\c!OutColor, line width=\r, #1] #6;
    }
}

\begin{tikzpicture}
    \Tube{2mm}{10}{gray!25}{black!75}
        {(0,0) to[out=70,in=200] (5,0)}
    \Tube[dashed]{2mm}{10}{yellow!25}{orange!75}
        {(0,1) to[out=70,in=200] (5,1)}
    \Tube{2mm}{3}{gray!25}{black!75}
        {(0,2) to[out=70,in=200] (5,2)}
    \Tube{2mm}{25}{gray!25}{black!75}
        {(0,3) to[out=70,in=200] (5,3)}
    \Tube{2mm}{25}{white}{black}
        {(0,4) to[out=0,in=0] (2.5,6) to[out=180,in=180] (5,4)}
    \Tube{2mm}{25}{orange!25}{red}
        {(0,5.5) to[out=0,in=0] (2.5,7.5)}
    \Tube{2mm}{25}{orange!25}{red}
        {(2.5,7.5) to[out=180,in=180] (5,5.5)}
\end{tikzpicture}

\end{document}

enter image description here


Edit 1: If you want a stronger 3D effect, you can draw small ellipses on the "tubes":

Code

\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{decorations.markings}
\usepackage{xifthen}

\begin{document}

\newcommand{\Tube}[9][]%
% [further options], width, iterations, inner color, outer color, path definition, decorate yn, decorate length, decorate offset
{   \colorlet{InColor}{#4}
    \colorlet{OutColor}{#5}
    \foreach \I in {1,...,#3}
    {   \pgfmathsetlengthmacro{\h}{(\I-1)/(#3-0.7)*#2}
        \pgfmathsetlengthmacro{\r}{sqrt(pow(#2,2)-pow(\h,2))}
        \pgfmathsetmacro{\c}{(\I-0.5)/#3*100}
        \draw[InColor!\c!OutColor, line width=\r, #1] #6;
    }
    \ifthenelse{\equal{#7}{y}}
    {   \path[decoration={markings, mark=between positions #9 and 1 step #8 with {\draw[OutColor] (0,#2/2-\pgflinewidth/2) arc (90:-90:#2/4 and #2/2-\pgflinewidth/2);}}, decorate] #6;
    }
    {}  
}

\begin{tikzpicture}
    \Tube{3mm}{10}{gray!25}{black!75}
        {(0,0) to[out=70,in=200] (5,0)}
        {y}{5mm}{2mm}
    \Tube[dashed]{2mm}{10}{yellow!25}{orange!75}
        {(0,1) to[out=70,in=200] (5,1)}
        {n}{}{}
    \Tube{5mm}{3}{gray!25}{black!75}
        {(0,2) to[out=70,in=200] (5,2)}
        {y}{0.05}{0.025}
    \Tube[densely dashed]{1mm}{25}{gray!25}{black!75}
        {(0,3) to[out=70,in=200] (5,3)}
        {n}{}{}
    \Tube{2mm}{25}{white}{black}
        {(0,4) to[out=0,in=0] (2.5,6) to[out=180,in=180] (5,4)}
        {y}{5mm}{1.5mm}
    \Tube{2mm}{25}{orange!25}{red}
        {(0,5.5) to[out=0,in=0] (2.5,7.5)}
        {y}{0.03}{0.02}
    \Tube{2mm}{25}{orange!25}{red}
        {(2.5,7.5) to[out=180,in=180] (5,5.5)}
        {y}{0.03}{0.01}
\end{tikzpicture}

\end{document}

Output

enter image description here

Tom Bombadil
  • 40,123