how to draw a jigsaw using five patterns

I think this is a good chance to practice pgf's parser module. See the manual for more information.

The foreground layer is actually unnecessary. But since the pocket is drawn by a white circle, I have to draw the tab on a different layer.

The clipping syntax, shift and scale are unnecessary, too. But that means you have to recode your pieces.

\documentclass[tikz]{standalone}
\usepgfmodule{parser}

\pgfdeclarelayer{foreground}
\pgfsetlayers{main,foreground}

\pgfparserdef{jigsaw}{all}{the character 1}{\def\jigsawtype{1}}
\pgfparserdef{jigsaw}{all}{the character 2}{\def\jigsawtype{2}}
\pgfparserdef{jigsaw}{all}{the character 3}{\def\jigsawtype{3}}
\pgfparserdef{jigsaw}{all}{the character 4}{\def\jigsawtype{4}}
\pgfparserdef{jigsaw}{all}{the character 5}{\def\jigsawtype{5}}

\pgfparserdef{jigsaw}{all}{the letter A}   {\def\jigsawangle{0}}
\pgfparserdef{jigsaw}{all}{the character <}{\def\jigsawangle{90}}
\pgfparserdef{jigsaw}{all}{the letter V}   {\def\jigsawangle{180}}
\pgfparserdef{jigsaw}{all}{the character >}{\def\jigsawangle{-90}}

\pgfparserdef{jigsaw}{all}{blank space \space}{}
\pgfparserdef{jigsaw}{all}{the character :}{\jigsawstart}
\pgfparserdef{jigsaw}{all}{the character ,}{\jigsawdrawone}
\pgfparserdef{jigsaw}{all}{the character ;}{\jigsawnewline}
\pgfparserdef{jigsaw}{all}{the character .}{\jigsawend}


\def\jigsawstart{
    \path coordinate(line begin)coordinate(curser);
}
\def\jigsawdrawone{
    \draw(curser)pic[rotate=\jigsawangle]{jigsaw \jigsawtype};
    \path(curser)++(1,0)coordinate(curser);
}
\def\jigsawnewline{
    \path(line begin)++(0,-1)coordinate(line begin)coordinate(curser);
}
\def\jigsawend{
    \pgfparserswitch{final}
}

\begin{document}

\tikzset{
    sq/.style={cyan,draw=white,line width=.05cm},
    cl/.style={clip,fill=none},
    fc/.style={cyan},
    fw/.style={white},
    jigsaw 1/.pic={
        \tikzset{scale=.25,shift={(-2,-2)}}
        \fill[sq](4,4)--(0,4)--(0,0)--(4,0)--cycle;
        \fill[cl](4,4)--(0,4)--(0,0)--(4,0)--cycle;
        \fill[fw](3.5,2)circle(.9);
        \fill[fw](2,3.5)circle(.9);
    },
    jigsaw 2/.pic={
        \tikzset{scale=.25,shift={(-9,-2)}}
        \begin{pgfonlayer}{foreground}
        \fill[fc](6.5,2)circle(.7);
        \fill[fc](9,4.5)circle(.7);
        \end{pgfonlayer}
        \fill[sq](7,0)--(11,0)--(11,4)--(7,4)--cycle;
        \fill[cl](7,0)--(11,0)--(11,4)--(7,4)--cycle;
        \fill[fw](10.5,2)circle(.9);
    },
    jigsaw 3/.pic={
        \tikzset{scale=.25,shift={(-16,-2)}}
        \begin{pgfonlayer}{foreground}
        \fill[fc](13.5,2)circle(.7);
        \fill[fc](18.5,2)circle(.7);
        \end{pgfonlayer}
        \fill[sq](14,0)--(18,0)--(18,4)--(14,4)--cycle;
        \fill[cl](14,0)--(18,0)--(18,4)--(14,4)--cycle;
        \fill[fw](16,3.5)circle(.9);
    },
    jigsaw 4/.pic={
        \tikzset{scale=.25,shift={(-23,-2)}}
        \begin{pgfonlayer}{foreground}
        \fill[fc](23,4.5)circle(.7);
        \end{pgfonlayer}
        \fill[sq](21,0)--(25,0)--(25,4)--(21,4)--cycle;
        \fill[cl](21,0)--(25,0)--(25,4)--(21,4)--cycle;
        \fill[fw](24.5,2)circle(.9);
        \fill[fw](21.5,2)circle(.9);
        \fill[fw](23,.5)circle(.9);
    },
    jigsaw 5/.pic={
        \tikzset{scale=.25,shift={(-30,-2)}}
        \begin{pgfonlayer}{foreground}
        \fill[fc](30,4.5)circle(.7);
        \fill[fc](32.5,2)circle(.7);
        \end{pgfonlayer}
        \fill[sq](28,0)--(32,0)--(32,4)--(28,4)--cycle;
        \fill[cl](28,0)--(32,0)--(32,4)--(28,4)--cycle;
        \fill[fw](28.5,2)circle(.9);
        \fill[fw](30,.5)circle(.9);
    }
}

\tikz{
    \pgfparserparse{jigsaw}:
        1>,3V,2V,2V,2V,2V,2V,2V,2V,1V,;
        2>,5A,4>,5>,5>,5>,5>,5>,5>,3<,;
        2>,4A,5<,5V,5V,5V,5V,5V,5V,2<,;
        2>,5A,4A,5V,5V,5V,5V,5V,5V,2<,;
        2>,5A,4A,5V,5V,5V,5V,5V,5V,2<,;
        3>,5<,5<,4<,4<,4<,4<,5<,5V,2<,;
        1A,2A,2A,2A,2A,2A,2A,2A,3A,1<,.
}

\end{document}


Instead of worrying yourself how to puzzle together your jigsaw pieces, you could use the jigsaw package to automatically create a pattern of your desired dimensions:

\documentclass{article}

\usepackage{jigsaw}

\begin{document}

\begin{tikzpicture}
    \fill[cyan] (0,0) rectangle (11,7);
  \jigsaw{11}{7}
\end{tikzpicture}

\end{document}

enter image description here

(the trick is to not try to puzzle matching pieces together, but to draw only every second line :)

Tags:

Tikz Pgf