\documentclass{standalone} \usepackage{luamplib} \begin{document} \mplibtextextlabel{enable} \begin{mplibcode} input colorbrewer-rgb vardef make_image(expr P, n, u, v, s, arrows) = save currentpicture; picture currentpicture; currentpicture := nullpicture; for i = -n upto n: for j = -n upto n: draw P shifted (i * u + j * v); endfor endfor; if arrows: interim ahangle := 20; drawarrow origin--u dashed evenly scaled 1/2 withpen pencircle scaled 1/4 withcolor Reds 8 8; drawarrow origin--v dashed evenly scaled 1/2 withpen pencircle scaled 1/4 withcolor Blues 8 8; draw origin withpen pencircle scaled 1; fi clip currentpicture to s; draw s dashed withdots scaled 1/2; currentpicture enddef; beginfig(1); path hexagon, triangle; pair u, v; numeric n; triangle = for i=0 upto 2: (0, 16) rotated 120i -- endfor cycle; hexagon = for i=0 upto 5: (0, 16) rotated 60i -- endfor cycle; u = point 0 of triangle - point 1 of triangle; v = u rotated -60; path s; s = superellipse(89 right, 89 up, 89 left, 89 down, 0.78); n = 8; picture P[]; P3 = make_image(triangle, n, u, v, s, true); P6 = make_image(hexagon, n, u, v, s, true); picture T; T = image( path t'; t' = triangle reflectedabout(point 0 of triangle, point 1 of triangle); fill triangle withcolor Reds 8 2; fill t' withcolor Blues 8 2; draw triangle; draw t'; ); P4 = make_image(T, n, u, v, s, true); picture H; H = image( path ha, hb; ha = hexagon reflectedabout(point 0 of hexagon, point 1 of hexagon); hb = hexagon reflectedabout(point 0 of hexagon, point 5 of hexagon); fill hexagon withcolor Oranges 8 2; fill ha withcolor Blues 8 2; fill hb withcolor Greens 8 2; draw hexagon; draw ha; draw hb; ); P7 = make_image(H, n, u zscaled 1.732 dir 30, v zscaled 1.732 dir 30, s, true); picture dualt, dualh; dualt = image( draw triangle withcolor 1/2; for i=0 upto 2: draw origin -- point i+1/2 of triangle withcolor Reds 7 6; endfor draw currentpicture reflectedabout(point 0 of triangle, point 1 of triangle); ); dualh = image( draw hexagon withcolor 1/2; for i=0 upto 5: draw origin -- point i+1/2 of hexagon withcolor Reds 7 6; endfor ); P5 = make_image(dualt, n, u, v, s, false); P8 = make_image(dualh, n, u, v, s, false); draw P3 shifted (-100, +100); draw P4 shifted (-100, -100); draw P5 shifted (-100, -300); draw P6 shifted (+100, +100); draw P7 shifted (+100, -100); draw P8 shifted (+100, -300); endfig; \end{mplibcode} \end{document}