5

Is it possible to draw molecules in 3d with TikZ like in this picture?

enter image description here

  • 1
    Related/duplicate (2:1): Drawing 3D crystal lattice with tikz/pstricks – Werner May 9 '14 at 15:57
  • Do you want true 3D (with arbitrary rotations), or is such planar 2.5D sufficient? – Tom Bombadil Oct 15 '15 at 14:04
  • @Werner I'm sorry to be ignorant, but what does the 2:1 mean? – cfr Dec 13 '15 at 14:30
  • 1
    @cfr: If I recall, I meant it's more "related" than it is a "duplicate". – Werner Dec 14 '15 at 13:04
4

For pseudo 3D, you can define

  • different ball styles for the atoms
  • different bond syles

I wrote a general macro for defining bonds. It simply draws many lines on top of each other to simulate the look of 3D tubes. The bonds are drawn on a background plane so they don't overlap the atoms.

Code

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

\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

\begin{document}

\newcommand{\Bond}[6]%
% start, end, thickness, incolor, outcolor, iterations
{ \begin{pgfonlayer}{background}
        \colorlet{InColor}{#4}
        \colorlet{OutColor}{#5}
        \foreach \I in {#6,...,1}
        {   \pgfmathsetlengthmacro{\r}{#3/#6*\I}
            \pgfmathsetmacro{\C}{sqrt(1-\r*\r/#3/#3)*100}
            \draw[InColor!\C!OutColor, line width=\r] (#1.center) -- (#2.center);
        }
    \end{pgfonlayer}
}

\newcommand{\SingleBond}[2]%
% start, end
{   \Bond{#1}{#2}{1mm}{white}{gray!50}{10}
}

\newcommand{\RedBond}[2]%
% start, end
{   \Bond{#1}{#2}{1mm}{orange!70}{red!75!black}{10}
}

\newcommand{\BlueBond}[2]%
% start, end
{   \Bond{#1}{#2}{2mm}{cyan}{blue!50!black}{10}
}

\newcommand{\GreenBond}[2]%
% start, end
{   \Bond{#1}{#2}{0.7071mm}{green!25}{green!25!black}{10}
}

\begin{tikzpicture}
[   oxygen/.style={circle, ball color=red, minimum size=6mm, inner sep=0},
    hydrogen/.style={circle, ball color=white, minimum size=2.5mm, inner sep=0},
    carbon/.style={circle, ball color=black!75, minimum size=7mm, inner sep=0}
]
    \node[oxygen] (O1) at (0,0) {};
    \node[hydrogen] (H1) at (1,-0.5) {};
    \node[hydrogen] (H2) at (-1,-0.5) {};
    \SingleBond{O1}{H1}
    \SingleBond{O1}{H2}

    \foreach \c in {1,...,6}
    {   \node[carbon] (C-\c) at ($(2,3)+(\c*60:1.5)$) {};
        \node[hydrogen] (H-\c-a) at ($(2,3)+(\c*60-15:2.5)$) {};
        \node[hydrogen] (H-\c-b) at ($(2,3)+(\c*60+15:2.5)$) {};
        \RedBond{C-\c}{H-\c-a}
        \BlueBond{C-\c}{H-\c-b}
    }
    \foreach \c [evaluate={\c as \n using int(mod(\c,6)+1)}] in {1,...,6}
    {   \GreenBond{C-\c}{C-\n}
    }
\end{tikzpicture}

\end{document}

Output

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.