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}
Cragfelt
  • 4,005
ryuk
  • 2,257

3 Answers3

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

Sandy G
  • 42,558
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 (xu) shifted (yv); 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}

Thruston
  • 42,268
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

Mark Wibrow
  • 70,437