7

How can I draw a series of hexagon with a number inside of every hexagon (multiplication honeycomb)? I didn't find that pattern in logicpuzzle package.

enter image description here

Updating: I'm trying to wrtite $2x$ instead +2, $-3x$ instead -3 and $-6x^2$ instead -6, but it doesn't work. Why? I post my code. The hexagons are completely white.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes}
\usepackage{amsbsy} 
\usepackage{amsmath}
\newcommand{\hexmult}[2]{\begin{tikzpicture}[hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=1cm, draw,inner sep=0,anchor=south,rotate=30}]
\foreach \j in {1,...,#1}{%
  \foreach \i in {1,...,\j}{%
    \node[hexa] (h\i;\j) at ({(\i-\j/2)*sin(60)},{\j*0.75}) {};} } 
\begin{scope}[execute at begin node=$, execute at end node=$]
\foreach \k/\l in {#2}{\node at (h\k) {\l}; }  
\end{scope}
\end{tikzpicture}}

\begin{document}
\hexmult{2}{1;2/$ +2 $,2;2/{$ -3 $},1;1/}
\end{document}
7
  • 1
    Have you looked here?
    – Sandy G
    Nov 19, 2017 at 16:49
  • thanks for your answer. yes. The problem is that I can't fit the global blue hexagon structure into a structure that I've drawn down.
    – ryuk
    Nov 19, 2017 at 17:06
  • As a rule, packages make some things easier and others harder. There will come a point where you are better off not using a package than using it. Nov 19, 2017 at 17:19
  • 1
  • 1
    Don't use $..$. This code automatically parses entries in math mode. Just write \hexmult{2}{1;2/2x,2;2/-3x,1;1/-6x^2}.
    – Sandy G
    Jan 15, 2018 at 20:32

3 Answers 3

10

If you don't mind specifying the numbers backwards:

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz}
\tikzdeclarecoordinatesystem{hex}{%
 \pgfmathsetmacro\y{int(floor(sqrt(2*(#1))+0.5))}%
 \pgfmathsetmacro\x{int((\y-1)/2*\y))}%  
 \pgfpointxy{((#1)-\x-\y/2)* sin(60)}{\y*0.75}}
\tikzset{hex/.style={insert path={[every hex/.try]
  (30:1/2) \foreach \j in { 1,...,5} {-- (30+\j*60:1/2) } -- cycle 
  (0,0) node {$#1$}}}}
\begin{document}
\tikz\foreach \n [count=\i]in {+24,-4,-6,+2,-2,-3,-1,-2,+1,-3}
  \path [draw, shift=(hex cs:\i), hex=\n];
\tikz\foreach \n [count=\i]in {-6,+2,-3}
  \path [draw, shift=(hex cs:\i), hex=\n];
\tikz[every hex/.style={fill=blue!50!white!50!cyan, draw=white, text=white}]
  \foreach \n [count=\i]in {-2,+1,+3,-1,+1,+2}
    \path [draw, shift=(hex cs:\i), hex=\n];
\end{document}

enter image description here

1
  • Beautiful too your work. +1
    – Sebastiano
    Nov 21, 2017 at 8:02
14

enter image description here

I defined a new command \hexmult that takes 2 arguments. The first is a positive integer giving the number of rows of hexagons. The second is a comma-separated list, where each entry is of the form i;j/k. The j is the row (starting from the bottom), the i is the hexagon number (from the left), and the k is the cell contents, parsed in math mode (so the minus signs look right). You can fill as many of the cells as you like, or none by making the second argument empty.

The grid is a modification of Alain Matthes's solution here.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes}

\newcommand{\hexmult}[2]{\begin{tikzpicture}[hexa/.style= {shape=regular polygon,regular polygon sides=6,minimum size=1cm, draw,inner sep=0,anchor=south,rotate=30}]
\foreach \j in {1,...,#1}{%
  \foreach \i in {1,...,\j}{%
    \node[hexa] (h\i;\j) at ({(\i-\j/2)*sin(60)},{\j*0.75}) {};} } 
\begin{scope}[execute at begin node=$, execute at end node=$]
\foreach \k/\l in {#2}{\node at (h\k) {\l}; }  
\end{scope}
\end{tikzpicture}}

\begin{document}
\hexmult{4}{1;4/-1,2;4/-2,3;4/+1,4;4/-3,1;3/+2,2;3/-2,3;3/-3,1;2/-4,2;2/+6,1;1/-24}
\hexmult{3}{1;3/-1,2;3/+1,3;3/+2,2;2/+2}
\hexmult{2}{1;2/+2,2;2/-3,1;1/-6}
\end{document}

Note that you are not restricted to using numbers in the hexes. The code

\hexmult{2}{1;2/2x,2;2/-3x,1;1/-6x^2}

will produce the output:

enter image description here

1
10

Here's a way to draw your grids "by hand" using Metapost. The links in the comments show you similar approaches in tikz.

enter image description here

\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
  pair u, v;
  u = 23 right;
  v = u rotated 120;
  path gon;
  gon = for i=0 upto 5: 0.57735026919 u rotated (30 + 60i) -- endfor cycle;

  vardef mark(expr x, y, s) = 
      save p; pair p;
      p = origin shifted (x*u) shifted (y*v); 
      fill gon shifted p withcolor 7/8[blue, white];
      draw gon shifted p withcolor 3/4 blue;
      label(s, p);
  enddef;

  mark(0, 0, "$+24$");
  mark(0, 1, "$-4$");
  mark(1, 1, "$-6$");
  mark(0, 2, "$+2$");
  mark(1, 2, "$-2$");
  mark(2, 2, "$+3$");
  mark(0, 3, "$-1$");
  mark(1, 3, "$-2$");
  mark(2, 3, "$+1$");
  mark(3, 3, "$+3$");

endfig;
\end{mplibcode}
\end{document}

This is wrapped up in luamplib so compile with lualatex or adapt for plain MP or gmp package.

Update 2021

I know this is old, but since it got another up vote the other day, I thought perhaps an automatic version would be interesting:

enter image description here

Here the products are all calculated for you from the top row of cells. As before, compile with lualatex.

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
path hexagon; 
hexagon = for i=0 upto 5: 14 up rotated 60 i -- endfor cycle; 
pair u, v; 
u = point 9/2 of hexagon - point 3/2 of hexagon;
v = point 7/2 of hexagon - point 1/2 of hexagon;

vardef hexit(expr n) = 
    image(
        fill hexagon withcolor 7/8[if n < 0: blue elseif n > 0: red else: white fi, white]; 
        draw hexagon withcolor 2/3 blue;
        picture t; t = thelabel("$" & if n > 0: "+" elseif n < 0: "-" else: "" fi & decimal(abs(n)) & "$", origin);
        numeric wd; wd = xpart (urcorner t - llcorner t) + 4;
        draw t scaled min(1, (abs(u) / wd));
    )
enddef;

vardef trex(text t) =
    save cell, i, cells; numeric cell[], i, cells; 
    image(
        i = 0; for n=t:
            cell[incr i] = n;
            draw hexit(cell[i]) shifted (i * u);
        endfor
        cells = i;
        for j=cells-1 downto 1:
            for k=1 upto j:
                cell[incr i] = cell[i-j-1] * cell[i-j];
                draw hexit(cell[i]) shifted ((cells-j) * v) shifted (k * u);
            endfor
        endfor
    )
enddef;

beginfig(1);

draw trex(-1,-2,1,3);
draw trex(-1,1,2) shifted 120 right;
draw trex(1,-2,1,-2,1) shifted (32, -100);

endfig;
\end{mplibcode}
\end{document}
0

You must log in to answer this question.

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