I’ve been fascinated by Escher’s paintings. Like this one

His paintings are a mixture of mathematics and art. Look at the painting above. How would you instruct a computer to draw a painting like that? First let’s do some analysis:

  1. The painting consists of fish objects.
  2. If you look at two arbitrary fish objects, then they have the same shape, but have different position, scale, orientation and possibly color.
  3. The fish objects interlock perfectly. This has to do with the shape of the fish. It is designed in some clever way.

Any other observations?

  1. All fish are seen from above. You see: a head with 2 eyes, the body, 2 fins (1 on each side), a tail.
  2. Each fish is painted in 2 colours.
  3. The fish are grouped together: 4 fish form 1 group. These fish face each other, their bodies and tails forming a cross. 2 fish in a group have the same size, they are about (maybe exactly) half the size of the largest fish in the group; the size of the 4th fish is inbetween.
  4. Each group is connected to the 4 neighbouring groups: The tail, the fins and the body of a fish separated 2 fish from the neighbouring group.


Good job this dude didn`t write stories for kids!! :open_mouth:

or design street signs. Could you imagine what would happen? mass chaos.

Lifes a never-ending up hill struggle for my human as it is. Mind you! Hes kinky about anything remotely surreal, always has been, since his early teens. That probably helps explain why he`s puddled.
Take care

There are several symmetry axes in the image. The most obvious is a horizontal line through the center: the image below the line can be obtained by reflecting the image above the line, then rotating it 180 degrees around a vertical axis. Similarly, the right side of the image is a reflection+rotation of the left side of the image.

(Full disclosure: My crystallography professor put an Escher on our final exam.)


Or, you could define a group as fish whose fins touch. Seen this way, some groups have four fish, whose fins meet at right angles. But the other groups only have three fish, whose fins define a triangle. The asymmetric fins are the “trick” that makes the image work, since they allow one side of the fish to be smaller.


There are also places where only two fins touch. Instead of being centred on the tip of a fin with outer edge against trailing edge, it’s two trailing edges that are up against each other. Plus the red fish in the threesomes have a longer “outside” fin which curls back a little.

Douglas Hofstadter’s book, Gödel, Escher, Bach: an Eternal Golden Braid, is at once one of the most demanding and most fascinating books I’ve ever read. It defies simple explanation, but I encourage anyone interested in art, logic, symmetry, music, consciousness, reality – in any combination – to Google the subject and eventually to read the book.


Here is what strikes me as most curious about this image. Notice the four fins coming together in the center of the image. The only places in the image where this happens is on the diagonal lines out to the corners. You get an alternation as you go out of four fins, four heads, four fins, four heads. But everywhere else in the image, you see three fins coming together, not four. Yet, and this is the miraculous part, it is still four heads coming together throughout. So, how can the bulk of the space be filled with three fins / four heads. Seems like there would either too many heads to go around or too few fins!

A classic Escher conundrum.

The problem
Looking at the Escher woodcut we see that it consists of interlocking fishes. Each fish in the picture has the same basic shape, but it is reoriented and resized in such a way that it neatly interlocks with its neighbors. Escher made many such pictures. The problem we want to solve is how to make a software program that will make such pictures in as easy manner as possible.

The plan
If we have the basic shape of a fish, then we could generate the whole picture from this single shape by transforming it. Here are some possible transformations. Let p denote the original shape. Then we can define the following unary operations:


We can also define binary operations


Using these unary and binary operations we could express more complex operations like


giving the above operation a name, makes it easier to express still more complex transformations



Thus b is just a short name for below(beside(p,flipVertical§), beside(p,flipVertical§))

We can even use recursion

rightSplit(p, n) = If(n = 0 then return(p) otherwise return( beside(p, below(rightSplit(p, n - 1), rightSplit(p, n - 1)))))

By defining such operations we can easily express complex transformation of a basic shape, thus making it possible to express the pictures of Escher type.

Thats what I was gonna say! But! Bobs beaten me to it again!! tch!tch! :frowning:

Good thinking vic-k. If you study the code from my post you might notice that there is no mentioning anywhere about the size and absolute location of the different shapes. But the size and location must of course be there, otherwise it can’t work. How should we take care of that? I will not beat you to it this time. We are eagerly expecting your lucid explanation :wink: .

LUCID!! :open_mouth: y just being cruel now!! Y know I cant do, [i]'lucid'.[/i] It takes me all my time, just to study your [i]prose[/i], never mind your [i]code[/i] However! Heres one I knocked up earlier :wink:

Which one is knocked up?


On a more serious note, I think a different approach in order. I think you could not successfully generate an Escher-type image by thinking in terms of fish-units at all. The thing that looks like a fish in the image you posted invites one to think of the image in terms of the fish. But this is a mistake.

The image you posted has more than one level of complexity, but let’s first think of the more simple Escher tiling patterns, such as the ones on these sheets of M.C. Escher wrapping paper. [Yes, that’s right, I have M.C. Escher wrapping paper while you only dream of having M.C. Escher wrapping paper. It is especially useful for wrapping up round square copulas to give as gifts.] Such simple tiling patterns, whether the images at play be lizards or shells or birds, always have a simple polygonal shape as the fundamental tile shape. So, for example, a head-to-toe pair of lizards might more or less fill a square tile–except that their feet or tails might push out beyond the edges of the tile here or there. Each such protrusion is matched by an indentation on the kitty-corner part of the tile. So, basic key: polygonal shape of fundamental tile. Make a recognizable image within the tile–to make interlocking allow protrusions, but each must be matched by an “intrusion” on the opposite side the tile.

We would be done revealing the secret way to make an Escher tiling image, except that image you posted had an additional level of complexity. I hazard the following: Suppose you followed the tiling strategy above and then projected the resulting pattern onto a three-dimensional solid, like a cube with rounded edges. If we looked down on one corner of that cube, would we not see something like the image we see? Hence: Hypothesis: This more complex image is the result of a “standard” Escher tiling exercise projected onto a 3D surface. [Edit: This part doesn’t quite work, but it still cling to the idea that that aspect of the image will be able to be understood as a systematic deformation of a tile pattern.]

As you probably guessed, this is just my humble contribution to keeping vic-k in stunned mode. Anything for the cause!


Sharp! Sharp! :unamused: 8)
I was gonna say the one in the middle called Bristol, but that`s a bit tacky :frowning:

Im just stunned that you could post such a load of patently flawed twaddle, as the above. Itll serve you right if you get bobueland on your case. You`ll know what brain ache is then! :open_mouth:

Wouldn’t an outward deformation of he face (bulge but I can remember what the technical term is) accomplish what you are looking for?

The trick is to separate the image of the fish in two separate parts. The first part is the fish-painter. It knows how to draw a fish in any rectangle that you provide. In other words it is a procedure, which given a rectangle will draw a fish inside that rectangle. If you give it a small rectangle it will draw a small fish, if you give it a narrow rectangle it will draw a narrow fish inside it. The second part is the rectangle. The smart thing about separating the knowledge about how to draw the fish, and where to draw it, is that you can create an algebra of painters.

What is an algebra? An algebra is a set of objects and some operations on those objects, such that applying those operations on the objects will produce an objects that belong to the set. For instance the natural numbers are closed under the operations of addition and multiplication, because when you add or multiply two or more natural numbers you and up with a natural number. In this way you can indefinitely produce new natural numbers from old ones. In the same way we can combine the set of all painters with operations such as rotate90, flipVert, beside, and so on. For instance applying the operation beside on the two identical fish-painters will produce a new painter that knows how to draw the two fishes beside each other. By using simple operations together with recursion (of n steps) we can define a whole family of painters that know how to draw n fish-complexes that are related to each other, in similar way that Escher did. So his whole picture of fishes is only one painter!

If that is not mind boggling enough, how about abstracting one more step. We can abstract away the painters themselves and only keep the painter operations as our elements in a new set. We can now define new (meta)operations on that set, thus creating a new algebra. For instance look at the following meta operation:

squareOfFour(t1, t2, t3, t4) = below(beside(t3, t4), beside(t1, t2))

which given 4 operations will produce a new operation.When this operation operates on a given painter it will give a new painter as the result. This new painter will (when given a rectangle to draw into) produce an image.

For instance if id stands for identity operation then the call

squareOfFour[id, flipVert, id, flipVert]

will produce a painter operation that given a painter and a rectangle will produce an image with four images of the original painter, such that the original painter is drawn in the upper left corner, one flipped copy to the right of it, and copy of these two below them.

I hope you have the mind and taste for abstract reasoning, so that you see the beauty of this approach :wink:.

P.S. This example was originally devised by Peter Henderson.

It`s the only way I can cope with my in-laws :open_mouth:
Take care