V for Vertex

To create a simple fractal, take an equilateral triangle and divide it into four more equilateral triangles. Remove the middle triangle. Repeat the process with each new triangle and go on repeating it. You’ll end up with a shape like this, which is known as the Sierpiński triangle, after the Polish mathematician Wacław Sierpiński (1882-1969):

Sierpinski triangle

But you can also create the Sierpiński triangle one pixel at a time. Choose any point inside an equilateral triangle. Pick a corner of the triangle at random and move half-way towards it. Mark this spot. Then pick a corner at random again and move half-way towards the corner. And repeat. The result looks like this:

triangle

A simple program to create the fractal looks like this:

initial()
repeat
  fractal()
  altervariables()
until false

function initial()
  v = 3 [v for vertex]
  r = 500
  lm = 0.5
endfunc

function fractal()
  th = 2 * pi / v
[the following loop creates the corners of the triangle]
  for l = 1 to v
    x[l]=xcenter + sin(l*th) * r
    y[l]=ycenter + cos(l*th) * r
  next l
  fx = xcenter
  fy = ycenter
  repeat
    rv = random(v)
    fx = fx + (x[rv]-fx) * lm
    fy = fy + (y[rv]-fy) * lm
    plot(fx,fy)
  until keypressed
endfunc

function altervariables()
[change v, lm, r etc]
endfunc

In this case, more is less. When v = 4 and the shape is a square, there is no fractal and plot(fx,fy) covers the entire square.

square

When v = 5 and the shape is a pentagon, this fractal appears:

pentagon

But v = 4 produces a fractal if a simple change is made in the program. This time, a corner cannot be chosen twice in a row:

square_used1

function initial()
  v = 4
  r = 500
  lm = 0.5
  ci = 1 [i.e, number of iterations since corner previously chosen]
endfunc

function fractal()
  th = 2 * pi / v
  for l = 1 to v
    x[l]=xcenter + sin(l*th) * r
    y[l]=ycenter + cos(l*th) * r
    chosen[l]=0
  next l
  fx = xcenter
  fy = ycenter
  repeat
    repeat
      rv = random(v)
    until chosen[rv]=0
    for l = 1 to v
      if chosen[l]>0 then chosen[l] = chosen[l]-1
    next l
    chosen[rv] = ci
    fx = fx + (x[rv]-fx) * lm
    fy = fy + (y[rv]-fy) * lm
    plot(fx,fy)
  until keypressed
endfunc

One can also disallow a corner if the corner next to it has been chosen previously, adjust the size of the movement towards the chosen corner, add a central point to the polygon, and so on. Here are more fractals created with such variations:

square_used1_center

square_used1_vi1

square_used1_vi2

square_used2

pentagon_lm0.6

pentagon_used1_5_vi1

hexagon_used1_6_vi3

The Call of Cthuneus

Cuneiform, adj. and n. Having the form of a wedge, wedge-shaped. (← Latin cuneus wedge + -form) (Oxford English Dictionary)

This fractal is created by taking an equilateral triangle and finding the centre and the midpoint of each side. Using all these points, plus the three vertices, six new triangles can be created from the original. The process is then repeated with each new triangle (if the images don’t animate, please try opening them in a new window):

triangle_div2

If the centre-point of each triangle is shown, rather than the sides, this is the pattern created:

triangle_div2_dots

Triangles in which the sides are divided into thirds and quarters look like this:

triangle_div3

triangle_div3_dots

triangle_div4

triangle_div4_dots

And if sub-triangles are discarded, more obvious fractals appear, some of which look like Lovecraftian deities and owl- or hawk-gods:


cthuneus1

cthuneus2

cthuneus3

Curiouser and Cuneuser

This fractal is created by taking an equilateral triangle, then finding the three points halfway, i.e. d = 0.5, between the centre of the triangle and the midpoint of each side. Using all these points, plus the three vertices, seven new triangles can be created from the original. The process is then repeated with each new triangle:

7triangle

When sub-triangles are discarded, more obvious fractals appear, including this tristar, again using d = 0.5:

tristar

However, a simpler fractal is actually more fertile. This cat’s-cradle is created when d = 0.5:

catscradle

But as d takes values from 0.5 to 0, a very familiar fractal begins to appear: the Sierpiński triangle:

catscradle_expanding

When the values of d become negative, from -0.1 to -1, this is what happens:

catscradle_expanding_to_cuneus

Pre-previously posted (please peruse):

Curious Cuneus

A Feast of Fractiles

A rep-tile is a shape that can be divided into copies of itself. One of the simplest rep-tiles is the equilateral triangle, which can be divided into four copies of itself, like this:

Self-dividing equilateral triangle

If, on the other hand, the triangle is subdivided and then one of the copies is discarded, many interesting fractals can be made from this very simple shape:

Fractal triangle creating Sierpinski gasket

Triangle fractal 2

This sequence illustrates how a more complex fractal is created:

Triangle fractal 3 split image 1

Triangle fractal 3 split image 2

Triangle fractal 3 split image 3

Triangle fractal 3 split image 4

Triangle fractal 3 split image 5

Triangle fractal 3 split image 6

Triangle fractal 3 split image 7

Triangle fractal 3 split image 8

And here is the sequence in a single animated gif:

Triangle fractal 3

Triangle fractal 4

Triangle fractal 5

Triangle fractal 6

Triangle fractal 7

Triangle fractal 8

Triangle fractal 9

Triangle fractal 10

Triangle fractal 11

Triangle fractal 12

Triangle fractal 13

Triangle fractal 15

Triangle fractal 16

Triangle fractal 17

Triangle fractal 18

Triangle fractal 19

Triangle fractal 20

Triangle fractal 21

Triangle fractal 22

Triangle fractal 23

Triangle fractal 24

Triangle fractal 25

Triangle fractal 26