My Dad and I share a love of op art and are forever sending across images we like. He recently sent me something from Pinterest, and I loved it, but what I loved more was a related image, and I got to thinking about how to replicate it using SVGs. Yesterday morning I took a stab at it and clocked it was quite a simple design made up of 3 skewed and rotated rectangles that were then arranged into a hexagon. The hexagons were then placed adjacent to each other and offset above and below.
What took some time this morning was figuring out how a hexagonal design could be placed within a rectangle - but after staring at the lino in our bathroom it came to me.
Anyway, I also took the time to refactor the image I created in Inkscape so that it is made up of a def
and a couple of pattern
s. After all, the rectangular sides of the cubes have the same fill but are just rotated and skewed. So the fill could be a pattern
, the cube could be a def
, and then the arrangement of seven cubes (which are required to create a properly tessellating design, and all use the same cube, just arranged appropriately) could be another pattern
. From many hundreds of lines of repeating XML I came up with this:
<pattern id="side-fill"
x="0"
y="0"
width="36"
height="36"
patternUnits="userSpaceOnUse">
<path style="fill:#000000;stroke:none;"
d="M 0,30 2,30 1,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 2,30 4,30 3,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 4,30 6,30 5,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 6,30 8,30 7,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 8,30 10,30 9,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 10,30 12,30 11,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 12,30 14,30 13,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 14,30 16,30 15,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 16,30 18,30 17,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 18,30 20,30 19,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 20,30 22,30 21,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 22,30 24,30 23,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 24,30 26,30 25,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 26,30 28,30 27,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 28,30 30,30 29,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 30,30 32,30 31,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 32,30 34,30 33,0 z" />
<path style="fill:#000000;stroke:none;"
d="M 34,30 36,30 35,0 z" />
</pattern>
<defs>
<g id="cube">
<rect x="0"
y="0"
width="36"
height="36"
transform="matrix(0.87,-0.5,1,0.58,0,0)"
fill="url(#side-fill)" />
<rect x="0"
y="0"
width="36"
height="36"
transform="matrix(-0.87,-0.5,0,-1.15,30,51.9)"
fill="url(#side-fill)" />
<rect x="0"
y="0"
width="36"
height="36"
transform="matrix(0,1,-1,0.58,60,0)"
fill="url(#side-fill)" />
</g>
</defs>
<pattern id="tile"
x="0"
y="0"
width="125.28"
height="108"
patternUnits="userSpaceOnUse">
<g transform="translate(-30,54.6)">
<g transform="translate(93.96,-54)">
<use xlink:href="#cube" />
</g>
<g transform="translate(31.32,-54)">
<use xlink:href="#cube" />
</g>
<g>
<use xlink:href="#cube" />
</g>
<g transform="translate(62.64)">
<use xlink:href="#cube" />
</g>
<g transform="translate(125.28)">
<use xlink:href="#cube" />
</g>
<g transform="translate(93.96,54)">
<use xlink:href="#cube" />
</g>
<g transform="translate(31.32,54)">
<use xlink:href="#cube" />
</g>
</g>
</pattern>
Fun eh? You can see it in my playground
here, and with it being an SVG you can scale to your heart's content.