A motif is a pattern filling a unit square, such as the happy face in Figure 1.
Escher had the idea of forming a 2×2 tile by taking four copies of this motif and rotating each through some number of counterclockwise 90° turns (he was not consistent, and sometimes used clockwise turns). Then the tile would be used in the usual way to tile the plane. Since he would make a woodcut of the motif, the single woodcut could be used to generate the tile and then to create a tiling.
Figure 1. A motif and the tile obtained by gathering four copies in a square, rotating each copy either 0°, 90°, 180°, or 270°.
Following the notation of [Schattschneider 1997] (Escher’s original notation), we use the integers 1, 2, 3, and 4 to denote counterclockwise turns of 0°, 90°, 180°, and 270°. Thus the signature yields the pattern on the right in Figure 1.
First we must define functions to rotate and translate an object. The simplest approach is to replace each point in the object by its translated or rotated image, and that is what we do in the code that follows with the help of the delayed replacement, :>. Note that we restrict the item being replaced to numeric objects (NumericQ is new in 3.0; NumberQ would fail on symbolic objects such as ). Because we will work with motifs in the unit square, we subtract {0.5, 0.5}, apply the rotation matrix, and add back {0.5, 0.5}.
Warning: If a graphics object contains Circle[{0, 0}, 0.3, {1.57, 3.14}]
, then the transformation rules just defined would apply to the angle-pair {1.57, 3.14}
, which is not what is desired. So care must be taken when using this technique; this is why the smile was defined using sine and cosine and not using Circle
with a specified arc. The great benefit (but potential danger) of the replacement method is that it transforms all points in an object, no matter what level they occupy. (The Escher package is not yet enhanced to allow the full use of Circle
and Disk
objects. In fact, all motifs should at present consist solely of polygons. Lines may border the polygons as shown in Figure 2.)
Of course, we need a more interesting motif. Escher used the design in Figure 2 [Schattschneider 1990, p. 48], which is based on a 5×5 subdivision of the unit square. We first load our package so we can use AddLines to add proper (i.e., avoiding the unit square itself) borders to the polygons without having to do so manually. We want the added lines to be black, so we force that by using a replacement to wrap Black with each Line object.
Figure 2. Escher’s motif, based on a 5×5 subdivision of a unit square.
The main feature of the motif is that it covers the four corners and four midpoints of the sides. It is quite difficult to anticipate what sort of pattern a given signature, say , will lead to. In this column we will develop an EscherTiling function that turns signatures into patterns in the plane. The code that follows shows how this function would make a 6×6 tiling based on Escher’s motif and the signature (this can be input as {{1,2},{2,1}}); the Size option refers to the side-length of the rectangle or square defining the final image. We allow a square Size
to be abbreviated, so in the following example, Size -> 6
is equivalent to Size -> {6, 6}
. We may use standard Graphics options, such as GridLines, which help us see the 1×1 motif in this example.
Figure 3. The tiling generated by Escher’s motif and the rotation rules encoded in the signature .
While a single woodcut cannot accommodate flips, it is natural to consider them. Thus Escher generalized matters to allow –n to denote the result of rotating the motif n – 1 times and then flipping it about its horizontal axis. So now a signature might look like and a much larger variety of patterns results. Figure 4 shows two examples, generated by code that follows.
Figure 4. The patterns generated by a happy face and by Escher’s motif, using the rotation rules encoded in the signature , where a minus sign indicates that a horizontal flip follows the rotation. In this case only 1s appear, so there are no rotations, only flips.