I think I got the matrix formula for this pattern from “Introduction to Dynamics” by Percival and Richards (its certainly the pattern I remember from the book cover)
You can get different patterns if you move the slider. Python gtk code…
import pygtk
pygtk.require('2.0')
import gtk, math
class Pattern(object):
x, y = 0, 0
points=[]
alpha = 76.11
def __init__(self, xsize, ysize):
self.xsize, self.ysize = xsize, ysize
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Pattern")
window.connect("destroy", lambda w: gtk.main_quit())
vbox = gtk.VBox(homogeneous=False, spacing=5)
window.add(vbox)
self.area = gtk.DrawingArea()
self.area.set_size_request(xsize, ysize)
self.area.connect("expose-event", self.area_expose_cb)
self.area.connect("size-allocate", self.calculate_points)
slider = gtk.Adjustment(value=self.alpha, lower=0.0,
upper=100.0, step_incr=0.01)
slider.connect("value-changed", self.slider_changed)
self.hscale = gtk.HScale(slider)
vbox.pack_start(self.area, expand=True, fill=True, padding=0)
vbox.pack_start(self.hscale, expand=False)
window.show_all()
def slider_changed(self, slider):
self.alpha = slider.get_value()
self.calculate_points()
def calculate_points(self, area=None, event=None):
x, y, self.xsize, self.ysize = self.area.get_allocation()
xscale = self.xsize/2.0
yscale = self.ysize/2.0
m = 52
angle = self.alpha*math.pi/180.0
c = math.cos(angle)
s = math.sin(angle)
self.points=[]
try:
for j in range(m):
x = 0
y = j/float(m)
for n in range(200):
w = x
x = x*c - (y - x*x)*s
y = w*s + (y - w*w)*c
if abs(x)>4 or abs(y)>4: raise StopIteration()
if x>1 or y>1: continue
self.points.append((int(x*xscale+xscale), int(y*yscale+yscale)))
except StopIteration:
self.area.queue_draw()
def area_expose_cb(self, area, event):
blue = self.area.get_colormap().alloc_color("#0000FF")
pointgc = self.area.window.new_gc()
pointgc.set_foreground(blue)
area.window.draw_point(pointgc, 20, 10)
self.area.window.draw_points(pointgc, self.points)
def main():
gtk.main()
return 0
if __name__ == '__main__':
Pattern(600, 500)
main()



