16

Each of the five figures is drawn using a combination of a square, some circles and some sort of shading. I need to draw each of these using a single command so that they can fit and make a rectangle without gap, for example a 7 times 11 one. Even the arcs can be replaced by a zizag so that they make a rectangle when fit together but this means advanced computation and plotting.

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[scale=.35]
\draw[fill=cyan] (4.,4.) -- (0.,4.) -- (0,0) -- (4,0) -- cycle;
\draw[fill=white,  draw=none](3.5,2) circle (.8cm);
\draw[fill=white, draw=none](2,3.5) circle (.8cm);


\draw[fill=cyan] (7,0) -- (11,0) -- (11,4) -- (7,4) -- cycle;
\draw[fill=white,  draw=none](10.5,2) circle (.8cm);
\draw[fill=cyan,  draw=none](6.5,2) circle (.8cm);

\draw[fill=cyan, draw=none](9,4.5) circle (.8cm);


\draw[fill=cyan] (14,0) -- (18,0) -- (18,4) -- (14,4) -- cycle;
\draw[fill=cyan,  draw=none](13.5,2) circle (.8cm);
\draw[fill=cyan,  draw=none](18.5,2) circle (.8cm);

\draw[fill=white, draw=none](16,3.5) circle (.8cm);

\draw[fill=cyan] (21,0) -- (25,0) -- (25,4) -- (21,4) -- cycle;
\draw[fill=white,  draw=none](24.5,2) circle (.8cm);
\draw[fill=white,  draw=none](21.5,2) circle (.8cm);
\draw[fill=white,  draw=none](23,.5) circle (.8cm);
\draw[fill=cyan,  draw=none](23,4.5) circle (.8cm);


\draw[fill=cyan] (28,0) -- (32,0) -- (32,4) -- (28,4) -- cycle;
\draw[fill=cyan,  draw=none](30,4.5) circle (.8cm);
\draw[fill=cyan,  draw=none](32.5,2) circle (.8cm);
\draw[fill=white,  draw=none](28.5,2) circle (.8cm);
\draw[fill=white,  draw=none](30,.5) circle (.8cm);

\node at (2, -1) {\small type  1};
\node at (9, -1) {\small type  2};
\node at (16, -1) {\small type  3};
\node at (23, -1) {\small type 4};
\node at (30, -1) {\small type 5};
\end{tikzpicture}
\end{document}

enter image description here

enter image description here

  • I believe that the legal patterns are not unique. Which one do you like? Exactly the given one? – Symbol 1 Jan 28 '17 at 20:54
  • With only these types there are certain restrictions. There will be one and only one type 3 in each edge. You cannot have two type 3 in any given row or column. There can only be one type 4 in any row or column in the "hole to hole" direction. – John Kormylo Jan 28 '17 at 21:49
  • The 7x11 rectangles has more than one configurations yet all of the configurations have the same number of each type. – Thumbolt Jan 29 '17 at 2:04
16

I think this is a good chance to practice '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}

  • Found a overlap on the lower right corner; hope it does not harm. – Symbol 1 Jan 28 '17 at 22:12
  • You could sell this as a game "find the one overlap in this pattern" - it took me quite a bit to find it :) – user36296 Nov 19 '18 at 17:47
  • Or, put one thousand ducks on a page and find the one with red-white shirt and blue pants. – Symbol 1 Nov 19 '18 at 21:33
  • We could make a whole book with such riddles :) – user36296 Nov 19 '18 at 21:37
9

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 :)

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.