Penrose tilings with Sage

I would like to make a poster from a Penrose tiling. Google didn't give me any Sage code for doing this, but I wonder if someone here knows of such a thing!

edit retag close merge delete

You could try http://preshing.com/20110831/penrose-tiling-explained. An internet search for "penrose tiling algorithm" seems likely to be fruitful.

( 2012-10-22 22:15:03 +0200 )edit

Well, yes. I was hoping for some enterprising person to turn the explanation into code for me! ;) And in fact I'd like code which lets me color the tiling in some enlightening way.

( 2012-10-23 16:46:49 +0200 )edit

What would the input be to such desired code?

( 2012-10-25 23:17:57 +0200 )edit

Inputs would be size of the output image, and maybe some options for how the picture is colored (highlight symmetry, or highlight method of construction, perhaps).

( 2012-10-26 14:49:14 +0200 )edit

Sorry, I meant how is the Penrose tiling represented?

( 2012-10-26 15:28:11 +0200 )edit

Sort by ยป oldest newest most voted
# Adapted from http://preshing.com/20110831/penrose-tiling-explained

golden_ratio = (1 + sqrt(5))/2

def subdivide(triangles):
result = []
for color, A, B, C in triangles:
if color == 0:
# Subdivide red triangle
P = A + (B - A) / golden_ratio
result += [(0, C, P, B), (1, P, C, A)]
else:
# Subdivide blue triangle
Q = B + (A - B) / golden_ratio
R = B + (C - B) / golden_ratio
result += [(1, R, C, A), (1, Q, R, B), (0, R, Q, A)]
return result

# Create wheel of red triangles around the origin
triangles = []
for i in xrange(10):
B = exp((2*i - 1)*pi/10*I)
C = exp((2*i + 1)*pi/10*I)
if i % 2 == 0:
B, C = C, B  # Make sure to mirror every second triangle
triangles.append((0, 0, B, C))

# Draw n iterates
n = 5
for i in range(n):
P = Graphics()
for verts in triangles:
#P += polygon([(z.real(), z.imag()) for z in verts[1:]], color=['red', 'blue'][verts[0]])
P += line([(z.real(), z.imag()) for z in (verts[3], verts[1], verts[2])], color='black', thickness=2)
P.show(axes=False, aspect_ratio=1)
triangles = subdivide(triangles)

more

Nice code ! Actually, the code is much faster if you replace the symbolic constants (sqrt(5) and the exponential) by real numbers.

( 2013-03-29 08:54:05 +0200 )edit

Thanks! I updated the code to allow various coloring schemes, draw circular sectors on the tiles, and output the graphics object so that differing levels of iteration can be overlaid: http://www.nilesjohnson.net/aperiodic-tilings.html

( 2013-04-28 15:27:37 +0200 )edit