66

I really like CircuiTikZ for drawing diagrams in my LaTeX documents. However I mostly draw mechanical and not electronic systems, which is why I'm looking for some similar way to draw mechanical systems. What I want is something to draw masses, springs, dampers and ground (boundary condition). The diagrams here (page 16) are typical examples:

enter image description here

Anybody got some suggestions or am I out of luck?

2

5 Answers 5

86

Inspired by Andrew Stacey's pretty drawing, here's a take on two of the pictures you linked to. Once you start with drawing stuff like this, you'll pretty quickly accumulate your own library of elements, and every successive drawing will be easier.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,patterns,decorations.pathmorphing,decorations.markings}

\begin{document}

\begin{tikzpicture}[every node/.style={draw,outer sep=0pt,thick}]
\tikzstyle{spring}=[thick,decorate,decoration={zigzag,pre length=0.3cm,post length=0.3cm,segment length=6}]
\tikzstyle{damper}=[thick,decoration={markings,  
  mark connection node=dmp,
  mark=at position 0.5 with 
  {
    \node (dmp) [thick,inner sep=0pt,transform shape,rotate=-90,minimum width=15pt,minimum height=3pt,draw=none] {};
    \draw [thick] ($(dmp.north east)+(2pt,0)$) -- (dmp.south east) -- (dmp.south west) -- ($(dmp.north west)+(2pt,0)$);
    \draw [thick] ($(dmp.north)+(0,-5pt)$) -- ($(dmp.north)+(0,5pt)$);
  }
}, decorate]
\tikzstyle{ground}=[fill,pattern=north east lines,draw=none,minimum width=0.75cm,minimum height=0.3cm]


\node (M) [minimum width=3.5cm,minimum height=2cm] {mass, $m$};

\node (ground1) at (M.south) [ground,yshift=-1.5cm,xshift=-1.25cm,anchor=north] {};
\draw (ground1.north west) -- (ground1.north east);
\draw [spring] (ground1.north) -- ($(M.south east)!(ground1.north)!(M.south west)$);

\node (ground2) at (M.south) [ground,yshift=-1.5cm,anchor=north] {};
\draw (ground2.north west) -- (ground2.north east);
\draw [damper] (ground2.north) -- ($(M.south east)!(ground2.north)!(M.south west)$);

\node (ground3) at (M.south) [ground,yshift=-1.5cm,xshift=1.25cm,anchor=north] {};
\draw (ground3.north west) -- (ground3.north east);
\draw [spring] (ground3.north) -- ($(M.south east)!(ground3.north)!(M.south west)$);

\draw [-latex,ultra thick] (M.north) ++(0,0.2cm) -- +(0,1cm);

\begin{scope}[xshift=7cm]
\node (M) [minimum width=1cm, minimum height=2.5cm] {$m$};

\node (ground) [ground,anchor=north,yshift=-0.25cm,minimum width=1.5cm] at (M.south) {};
\draw (ground.north east) -- (ground.north west);
\draw [thick] (M.south west) ++ (0.2cm,-0.125cm) circle (0.125cm)  (M.south east) ++ (-0.2cm,-0.125cm) circle (0.125cm);

\node (wall) [ground, rotate=-90, minimum width=3cm,yshift=-3cm] {};
\draw (wall.north east) -- (wall.north west);

\draw [spring] (wall.170) -- ($(M.north west)!(wall.170)!(M.south west)$);
\draw [damper] (wall.10) -- ($(M.north west)!(wall.10)!(M.south west)$);

\draw [-latex,ultra thick] (M.east) ++ (0.2cm,0) -- +(1cm,0);
\end{scope}
\end{tikzpicture}

\end{document}

springs and stuff

4
  • 2
    Very nice! Looks professional. Commented Mar 21, 2011 at 7:53
  • 4
    Cool! What about to write a package for that?
    – Spike
    Commented May 6, 2011 at 8:49
  • 1
    Thank you very much! It's a good starting point for me to create mechanical (or any other) pictures!
    – uzsolt
    Commented Apr 22, 2012 at 15:56
  • 1
    The only change I made was to do the springs and dampers in a slightly different fashion: \draw [spring] ($(wall.east)+(0,0.3cm)$)-- ($(M.west)+(0,0.3cm)$); This way you just specify a x,y distance instead of angles and doing that crazy math... Commented Jul 22, 2015 at 20:40
21

As Jake said, it's fairly easy to draw these using the existing TikZ tools. Here's a diagram of a coupled pendulum that I use in my lectures.

coupled pendula

Code:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}


\begin{document}
\begin{tikzpicture}
\draw[ultra thick,blue] (0,0) -- (1,-3);
\fill[green!50!black] (1,-3) circle (.4);
\draw[->,thick,red!50!green] (1,-3) -- (-.5,-3.5);
\draw[ultra thick,blue] (0,0) -- (-2,-4);
\fill[green!50!black] (-2,-4) circle (.3);
\draw[->,thick,red!50!green] (-2,-4) -- (-1,-4.5);
\draw[thick,orange] (-1,-2) -- (-.8,-2) (.5,-2) -- (.667,-2);
\draw[thick,orange,decorate,decoration={coil,aspect=0.7,amplitude=5}] (-.8,-2) -- (.5,-2);
\draw[<->,thick,red!50!green] (-1,-2.5) -- (.667,-2.5);
\fill (0,0) circle (.2);
\end{tikzpicture}
\end{document}

The bit to notice is the spring. As Jake said in his comment, this is done by replacing the path by a coil.

1
  • 1
    Mmmmh! This makes me glad that my undergrad times with compulsory Engineering Mechanics classes are over...
    – Jake
    Commented Mar 20, 2011 at 23:26
7

you can use this package

http://sciences-indus-cpge.papanicola.info/Schema-cinematique-avec-pgf-tikz

3
  • 1
    That looks like an interesting package! Would you be able to post an example implementation of one of the figures I have in my answer?
    – Jake
    Commented May 6, 2011 at 20:02
  • The link is broken
    – Yola
    Commented Feb 6, 2015 at 10:47
  • ça fonctionne le pdf : sciences-indus-cpge.papanicola.info/IMG/pdf/rpcinematik.pdf
    – rpapa
    Commented Feb 6, 2015 at 17:18
7

This is now easy as pie with circuitikz v0.6 (released in 2016):

\documentclass[preview]{standalone}
\usepackage{circuitikz}
\begin{document}
    \begin{circuitikz}
      \draw (1,2.5) to[short] (1,2);
      \draw[color=blue] (1,2) to[short] (0,2)
                              to[damper] (0,0)
                              to[short] (1,0);
      \draw[color=red] (1,2) to[short] (2,2)
                              to[spring] (2,0)
                              to[short] (2,0)
                              to[short] (1,0);
      \draw (1,0) to[short] (1,-0.5);
   \end{circuitikz}
\end{document}

rendering

2

This might help. One can use an american resistor or cute inductor for springs, and a european resistor for mass.

\documentclass{standalone}
\usepackage{circuitikz}

\makeatletter
% ************************* mechanical dashpot **************************
\ctikzset{bipoles/dashpot/height/.initial=.6}
\ctikzset{bipoles/dashpot/width/.initial=.8}

\pgfcircdeclarebipole{}
  {\ctikzvalof{bipoles/dashpot/height}}
    {dashpot}
    {\ctikzvalof{bipoles/dashpot/height}}
    {\ctikzvalof{bipoles/dashpot/width}}
{
    \pgfsetlinewidth{\pgfkeysvalueof{/tikz/circuitikz/bipoles/thickness}\pgfstartlinewidth}
    \pgfextractx{\pgf@circ@res@right}{\northeast}
    \pgfextractx{\pgf@circ@res@left}{\southwest}
    \pgfextracty{\pgf@circ@res@up}{\northeast}
  \pgfextracty{\pgf@circ@res@down}{\southwest}

  \pgfmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@down}}
  \pgflineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@down}}
  \pgflineto{\pgfpoint{\pgf@circ@res@left}{\pgf@circ@res@up}}
  \pgflineto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up}}
  \pgfmoveto{\pgfpoint{0}{0.9\pgf@circ@res@up}}
  \pgflineto{\pgfpoint{0}{0.9\pgf@circ@res@down}}
  \pgfusepath{draw}
  \pgfsetlinewidth{\pgfstartlinewidth}
  \pgfmoveto{\pgfpointorigin}
  \pgflineto{\pgfpoint{\pgf@circ@res@right}{0}}
  \pgfusepath{draw}
}

% create dashpot to-path style

\def\dashpotpath#1{\pgf@circ@bipole@path{dashpot}{#1}}
\compattikzset{dashpot/.style = {\circuitikzbasekey, /tikz/to path=\dashpotpath}}
\makeatother

\begin{document}
\begin{circuitikz}
\draw (0,0) to[dashpot,o-*] (2,0);
\draw (3,1) to[dashpot,o-*] (3,-1);
\end{circuitikz}
\end{document}

dashpot

1
  • 1
    Damper, spting and mass components have since been added to the standard circuitiz set. Commented Oct 13, 2017 at 15:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .