Mark Dow

Geek art

Simple recursive systems and fractal patterns

2x2 symmetric L-systems

   The simplest 2x2 replacement systems with rules that are globally and locally symmetric and self-symmetric (see symmetries of block replacement L-systems).
   
    Many other types of systems also have a large number of symmetries, for example:
2x2 4-rotation cyclic L-systems

Three symbol symmetric systems with two terminating rules, link to Three symbol symmetric systems with two terminating rules, link to Four symbol symmetric systems with two terminating rules, link to Five symbol symmetric systems with two terminating rules, link to Five symbol symmetric systems with two terminating rules, link to Five symbol symmetric systems with two terminating rules, link to Seven symbol symmetric systems with two terminating rules, link to Square wave quarter-twist system, link to Square waves system, link to Square wave half-twist system, link
Two symbol systems
Three symbol symmetric systems with two terminating rules
Four symbol symmetric systems with two terminating rules
Five symbol symmetric systems with two terminating rules
Six symbol symmetric systems with two terminating rules
Seven symbol symmetric systems with two terminating rules

Two symbol systems

    The two most symmetric 2-symbol 2x2 system that have a unique 2-D pattern (up to rotation and/or swap of symbols), are the 2-D Thue-Morse system and a plain checkerboard.

[To Do: Representation of  TM and CB.]


Three symbol symmetric systems with two terminating rules

    A simple static system that terminates at the first generation, included for completeness. This system is not reccurent; the second (gray) rule is only visited once, at the 1st generation. And while the first and last rules refer to themselves, they only refer to themselves and so leave the system's pattern the same.
Middle split algorithm graphic
Middle split by generation graphic
Middle split system pattern

    Note that the second (gray) rule is only visited once, at the 1st generation.

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 3, 1, 0, '', 1, [0 0; 0 0], [0 2; 0 2], [2 2; 2 2] );
where [ng] is the number of generations.

 Diagonal split system
Diagonal split algorithm graphic
Diagonal split by generation graphic
Diagonal split system pattern Diagonal split scale symmetry diagram
    Any square region centered anywhere on the diagonal is geometrically similar to any other such region at every generation.

    This system can be considered as a simple tally number system, where each column is a set of 0's and 1's. The the number of 1's in a column represents an integer,  increasing from left to right. The gray symbol/rule would represent a generator that takes a number (the current column value), multiplies by two and adds 0 (n, null) and 1 to generate a pair of columns, each with a single new generator. Starting with the generator g, the system generates all integers (a tally of contiguous 1's) with no duplicates:

g   ->  n  g  ->  n n   n g    ...
        g  1      n n   g 1

                  n g   1 1
                                    g 1   1 1            where each pair of columns is generated from a previous column,
____________________________
0   
->  0  1  ->  0 1   2 3    ...   and the number of 1's represents an integer.
  
Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 3, 1, 0, '', 1, [0 0; 0 0], [0 1; 1 2], [2 2; 2 2] );
where [ng] is the number of generations.


Binary tally system
Binary tallly algorithm graphic
Binary tallly by generation graphic
Binary tally system pattern, link to 11th generation Binary tally scale system symmetry graphic

    The pattern is a binary fractal-- the white and black regions are mirror image of each other, and the bottom two quadrants are both scaled copies of the whole. It is also a fractal tiling with a fractal (but finite boundary length) prototile. All singularities are on a line at the bottom.

    This system "grows" by adding a new periodic row of binary symbols [To Do: Show the 1-D periodic binary system.], at twice the spatial frequency (same phase at the left and right, an at the beginning of every even cycle) and half the height of the row above it.

    The system can be considered as a binay tally system, where each column is a set of binary elements, numerically increasing from left to right. The gray symbol/rule would represent a generator that takes a number (the current column value), multiplies by two and adds 0 (n, null) and 1 to generate the next pair of columns, each with a single new generator. Starting with the generator g, the system generates all integers (a tally of contiguous 1's) with no duplicates:

[To Do: Same style diagram as above, compare the systems.]

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 3, 1, 0, '', 1, [0 0; 0 0], [0 2; 1 1], [2 2; 2 2] );
where [ng] is the number of generations.


Periodic alternating bits system
Periodic alternating bits algorithm graphic
Periodic alternating bits by generation graphic
Periodic alternating bits system pattern, link to 11th generation Periodic alternating bits system symmetry graphic


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 2 2], [3 0; 1 1], [3 3; 3 3] );
where [ng] is the number of generation


Four symbol symmetric systems with two terminating rules

Reflected binary (Gray) code system
Reflected binary (Gray) code algorithm graphic
Reflected binary (Gray) code by generation graphic
Reflected binary (Gray) code system pattern, link to 11th generation Reflected binary (Gray) code system symmetry graphic

    Each row is a Thue-Morse sequence (with white and black as symbols) with symbols that double in size between rows. The number represented by each column (the number of white pixels, or the binary number encoded in the column's symbols) maps the column's index (0, 1, 2, 3, 4... from left to right) to the Gray code position of that column's index (0, 1, 3, 2, 7, ...).

    The name "Reflected binary system", because of its relationship to the reflected binary (Gray) code, is a bit misleading. Notice that the pattern and self-similarity diagram do not contain a reflection (mirror) symmetry about the central vertical. The left and right halves are related by a swap of the left and right and a swap of symbols (black <-->white and dark gray <--> light gray).  The rows of the pattern, from top to bottom, alternate between  a swap of symbol symmetry and a mirror symmetry. The bottom row (all dark or light gray) alternate between these two symmetries by generation.

     Another rendering of this basic pattern is found in Stephen Wolfram's "A New Kind of Science", page 83, figure b.

    The Gray code, also known as the reflected binary code, forms a Hamiltonian cycle on a hypercube where each bit represents one dimension

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 1 2], [3 0; 2 1], [3 3; 3 3] );
where [ng] is the number of generations.


Periodic bits system
Periodic bits algorithm graphic
Periodic bits by generation graphic
Periodic bits system pattern, link to 11th generation

    Each column contains a unique number of white (and black) pixels, so this pattern can be viewed as a reordering of integers. If the number of white pixels in sequential columns is expressed as a binary number, the rows are periodic. The bottom row has period 2 and each row above the period increases by a factor of 2 (4, 8, 16 ...). The third generation sequence, for example, contains this sequence of white voxels:

0 0 0 0 0 0 0 0    <- period 16    
1 1 1 1 0 0 0 0    <- period  8 
0 0 1 1 0 0 1 1    <- period  4
1 0 1 0 1 0 1 0    <- period  2   binary (vertical column, least significant bit at bottom)
_______________
5 4 7 6 1 0 3 2                   decimal

The number of black voxels is the bit-wise complement of this sequence.

    This ordering of integers is related to nimbers, in particular nim-sum sequences (for example Sloane's A004462, nimsum n + 21).

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [2 0; 3 2], [0 1; 1 3], [3 3; 3 3] );
where [ng] is the number of generations.


Sparse Thue-Morse system
Sparse Thue-Morse algorithm graphic
Sparse Thue-Morse by generation graphic
Sparse Thue-Morse system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 2; 2 0], [1 3; 3 1], [3 3; 3 3] );
where [ng] is the number of generations.


Three-legged diagonal system
Tree-legged diagonal algorithm graphic
Tree-legged diagonal by generation graphic
Tree-legged diagonal system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 2; 2 0], [3 1; 1 3], [3 3; 3 3] );
where [ng] is the number of generations.



Three-legged inverse diagonal system
Tree-legged inverse diagonal algorithm graphic
Tree-legged inverse diagonal by generation graphic
Tree-legged inverse diagonal system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 2; 2 3], [3 1; 1 0], [3 3; 3 3] );
where [ng] is the number of generations.



Anti-spikes system
Anti-spikes algorithm graphic
Anti-spikes by generation graphic
Anti-spikes system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 2; 2 1], [2 1; 1 0], [3 3; 3 3] );
where [ng] is the number of generations.


Binary teeth system
Binary teeth algorithm graphic
Binary teeth by generation graphic
Binary teeth system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 2 2], [1 1; 3 0], [3 3; 3 3] );
where [ng] is the number of generations.


Alternating half-rotation system
Alternating half-rotation graphic
Alternating half-rotation by generation graphic
Alternating half-rotation system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 1 2], [2 1; 3 0], [3 3; 3 3] );
where [ng] is the number of generations.


Alternating rotate inverse system
Alternating rotate inverse algorithm graphic
Alternating rotate inverse by generation graphic
Alternating rotate inverse system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 3 2], [0 1; 3 0], [3 3; 3 3] );
where [ng] is the number of generations.


Alternating bar system
Alternating bar algorithm graphic
Alternating bar by generation graphic
Alternating bar system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 3; 0 2], [3 1; 3 0], [3 3; 3 3] );
where [ng] is the number of generations.


Corner rotate system
Corner rotate algorithm graphic
Corner rotate by generation graphic
Corner rotate system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 0; 0 2], [3 1; 3 3], [3 3; 3 3] );
where [ng] is the number of generations.


Corner corner system
Corner corner algorithm graphic
Corner corner by generation graphic
Corner corner system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 4, 1, 0, '', 1, [0 0; 0 0], [0 0; 0 2], [1 3; 3 3], [3 3; 3 3] );
where [ng] is the number of generations.


Five symbol symmetric systems with two terminating rules


Omega system
Omega algorithm graphic
Omega by generation graphic
Omega system pattern, link to 11th generation

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 1, [0 0; 0 0], [0 2; 2 0], [1 3; 3 1], [2 4; 4 2], [4 4; 4 4] );
where [ng] is the number of generations.
Binary tally to diagonal split system
Binary tally to diagonal split algorithm graphic
Binary tally to diagonal split by generation graphic
Binary tally to diagonal split system pattern, link to 11th generation

    The pattern is also a binary fractal -- with the same scale symmetries as the binary tally system alone. Note that the diagonal split rules are seperable from (don't refer to) the binary tally rules.


[To Do: Finish description. Note that diagonal generators occur along diagonal boundaries as well as on bottom row -- show blow-up of a triangle top tip.] [To Do: What system has a 2:1 diagonal split, such that it could replace rules 1 and 3 to get continuous boundaries? I suspect it is 4-symbol, with 2 terminating rules. The binary tally to binary split system (below) achieves a 2:1 diagonal split along with a stepped boundary.]
[To Do: Diagonal split to binary tally system.]


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [0 1; 1 4], [1 3; 2 2], [3 0; 4 3], [4 4; 4 4] );
where [ng] is the number of generations.


Binary tally to mirrored diagonal split system
Binary tally to mirrored diagonal split algorithm graphic
Binary tally to mirrored diagonal split by generation graphic
Binary tally to mirrored diagonal split system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [1 4; 0 1], [1 3; 2 2], [4 3; 3 0], [4 4; 4 4] );
where [ng] is the number of generations.


Binary tally to binary step system
Binary tally to binary step algorithm graphic
Binary tally to binary step by generation graphic
Binary tally to binary step system pattern, link to 11th generation Binary tally scale system symmetry graphic

    The pattern is also a binary fractal -- with the same global scale symmetries as the binary tally system alone. Note that the binary split rules (2nd and fourth rules) are seperable from (don't refer to) the binary tally rules. The binary split rule alone is not symmetric -- there is an imbalance of black/white in the top two quadrants -- but the pair have mirror-inversion symmetry.


[To Do: What system has a 2:1 diagonal split, such that it could replace rules 1 and 3 to get continuous boundaries? I suspect it is 4-symbol, with 2 terminating rules.]

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [0 1; 0 4], [1 3; 2 2], [3 4; 0 4], [4 4; 4 4] );
where [ng] is the number of generations.


Diagonal split to binary tally system
Diagonal split to binary tally algorithm graphic
Diagonal split to binary tally by generation graphic
Diagonal split to binary tally system pattern, link to 11th generation

    The pattern is also a binary fractal -- with the same global scale symmetries as the binary tally system alone. Note that the binary split rules (2nd and fourth rules) are seperable from (don't refer to) the binary tally rules. The binary split rule alone is not symmetric -- there is an imbalance of black/white in the top two quadrants -- but the pair have mirror-inversion symmetry.


[To Do: What system has a 2:1 diagonal split, such that it could replace rules 1 and 3 to get continuous boundaries? I suspect it is 4-symbol, with 2 terminating rules.]

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [0 4; 1 1], [1 2; 2 3], [4 0; 3 3], [4 4; 4 4] );
where [ng] is the number of generations.


Diagonal split to rotated binary tally system
Diagonal split to rotated binary tally algorithm graphic
Diagonal split to rotated binary tally by generation graphic
Diagonal split to rotated binary tally system pattern, link to 11th generation

    Same as Diagonal split to binary tally system (above) but with the second rule mirrored about the horizontal.

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [1 1; 0 4], [1 2; 2 3], [4 0; 3 3], [4 4; 4 4] );
where [ng] is the number of generations.


Diagonal split to rotated mirrored binary tally system
Diagonal split to rotated mirrored binary tally algorithm graphic
Diagonal split to rotated mirrored binary tally by generation graphic
Diagonal split to rotated mirrored binary tally system pattern, link to 11th generation

    Same as Diagonal split to binary tally system but with the second rule rotated about the horizontal.

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 5, 1, 0, '', 2, [0 0; 0 0], [1 1; 4 0], [1 2; 2 3], [4 0; 3 3], [4 4; 4 4] );
where [ng] is the number of generations.


Six symbol symmetric systems with two terminating rules


Pyramid horizon system
Pyramid horizoon algorithm graphic
Pyramid horizon by generation graphic
Pyramid horizon system pattern, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 6, 1, 0, '', 2, [0 0; 0 0], [1 0; 5 1], [2 3; 5 1], [2 3; 4 0], [5 4; 4 0], [5 5; 5 5] );
where [ng] is the number of generations.

Seven symbol symmetric systems with two terminating rules


Binary tally to binary step to diagonal split system
Binary tally to binary step to diagonal split algorithm graphic
Binary tally to binary step to diagonal split by generation graphic
Binary tally to binary step to diagonal split system pattern, link to 11th generation Binary tally scale system symmetry graphic

    This system was designed by serially compositing of more simple systems, including the binary tally and diagonal split systems:

Bracket tiling composition diagram




    The pattern is also a binary fractal -- with the same global scale symmetries as the binary tally system alone.

"Bracket" tilings
                Bracket shape, link to                 Bracket tiling geometry, link to
Bracket octagon tiling, link to
This unit shape (or its bilateral mirror double) and its scaled copies can tile the plane in several other interesting ways. It is a fractal with one singularity, at the bottom tip. A copy ot the central pattern, scaled by 2+-n/2 and rotated by pi/4, fits (with no gap) onto the original pattern. Four rotations of this (center) cover a truncated square.

In addition to its four-fold rotational symmetry, this pattern has an odd (color inverse) symmetry about the horizontal, vertical and both diagonal axes.

Bracket tree spiral image, link to
Double ram image, link toDouble ram image, link to Bracket spiral frieze tiling, link to
   

Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 7, 1, 0, '', 2, [0 0; 0 0], [0 1; 1 6], [0 1; 0 6], [2 4; 3 3], [5 6; 0 6], [5 6; 0 5], [6 6; 6 6] );
where [ng] is the number of generations.



Square rotate 1 system
Square rotate 1 algorithm graphic
Square rotate 1 by generation graphic
Square rotate 1 system pattern, link to 11th generation

[To Do: When the whole system has rotational symmetries, the base of the scale-symmetry diagram should show these symmetries, as well as intra-quadrant scale-symmetries. Modify L_system_tiling.m to generate this properly.]
Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 7, 1, 0, '', 3, [0 0; 0 0], [4 5; 3 2], [2 0; 6 4], [6 3; 5 0], [2 6; 0 4], [0 3; 5 6], [6 6; 6 6] );
where [ng] is the number of generations.




Square wave quarter-twist system
Square wave quarter-twist algorithm graphic
Square wave quarter-twist by generation graphic
Square wave quarter-twist system pattern, link to 11th generation Square wave quarter-twist scale symmetry graphic


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 7, 1, 0, '', 1, [0 0; 0 0], [11 12; 10 9], [6 0; 12 0], [9 0; 0 0], [6 10; 6 0], [6 6; 6 11], [6 6; 6 6] );
where [ng] is the number of generations.



Square waves system
Square waves algorithm graphic
Square waves by generation graphic
Square waves system pattern, link to 11th generation Square waves scale symmetry graphic Square waves system pattern colored, link to 11th generation


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 7, 1, 0, '', 1, [0 0; 0 0], [11 12; 10 9], [1 0; 12 0], [9 0; 0 0], [6 10; 6 1], [6 6; 6 11], [6 6; 6 6] );
where [ng] is the number of generations.



Square wave half-twist system
Square wave half-twist algorithm graphic
Square wave half-twist by generation graphic
Square wave half-twist system pattern, link to 11th generation Square wave half-twist scale symmetry graphic


Matlab command:
>> imOut = L_system_tiling( 'BF', [ng], 7, 1, 0, '', 1, [0 0; 0 0], [17 18; 16 19], [6 0; 18 0], [19 0; 0 0], [6 16; 6 0], [6 6; 6 17], [6 6; 6 6] );
where [ng] is the number of generations.


------------------------------------
There are no restrictions on use of the images on this page. Claiming to be the originator of the material, explicitly or implicitly, is bad
karma. A link (if appropriate), a note to dow[at]uoregon.edu, and credit are appreciated but not required.

Comments are welcome (dow[at]uoregon.edu).