Arjen Markus (22 january 2010) The other day I came across the Gingerbreadman Map [L1 ], a surprisingly simple two-dimensional map that shows regions of chaotic behaviour. That is, if you repeatedly apply the map to adjacent points, they end up in completely different parts of the plane after a number of iterations.
The map is defined in this way:
xnew = 1 - y + |x| ynew = x
Since the map is piece-wise linear, line pieces will remain line pieces (though they might be broken up). To get a better idea of how it works, I wrote the program below. Enjoy!
# gingerbread.tcl -- # Draw the gingerbreadman map - or at least parts of it # # mapLine -- # Repeatedly map a line piece using the gingerbreadman map # # Arguments: # # n Number of mappings # x1 X-coordinate of first point # y1 Y-coordinate of first point # x2 X-coordinate of second point # y2 Y-coordinate of second point # colour Colour of the line # # Result: # None # # Side effect: # New line drawn on canvas # proc mapLine {n x1 y1 x2 y2 {colour black}} { .c create line $x1 $y1 $x2 $y2 -fill $colour for { set i 0 } { $i < $n } { incr i } { lassign [mapGinger $x1 $y1] x1 y1 foreach [mapGinger $x2 $y2] x2 y2 .c create line $x1 $y1 $x2 $y2 -fill $colour } } # mapGinger -- # Map the coordinates # # Arguments: # x X-coordinate # y Y-coordinate # # Result: # List of the new coordinates # proc mapGinger {x y} { set xnew [expr {1.0 - $y + abs($x)}] set ynew $x return [list $xnew $ynew] } # main -- # - Set up the canvas # - Draw several line pieces # - Rescale # pack [canvas .c -bg white -width 500 -height 500] .c create line -10.0 0.0 10.0 0.0 -fill grey .c create line 0.0 -10.0 0.0 10.0 -fill grey mapLine 30 1.0 -2.0 2.0 -2.0 mapLine 30 3.0 -2.0 4.0 -2.0 red mapLine 30 0.0 0.0 1.0 0.0 blue #mapLine 30 0.0 -3.0 1.0 -3.0 red #mapLine 30 0.0 -3.1 1.0 -3.1 blue #mapLine 30 0.0 -2.9 1.0 -2.9 green .c scale all 0 0 25 -25 .c move all 250 250
Here is the result: