Code in the R language and ggplot library to generate H-Fractals also known as the H-Tree, a self-similar fractal that starts with a H

Generate H-Fractals using ggplot

Peter Prevos

Peter Prevos |

680 words | 4 minutes

Share this content

A fractal is a geometric figure in which the same pattern repeats infinitely at an ever-smaller scale. One of the most simple examples is the H-Fractal. You construct a H-Fractal by starting with the line segments that resemble the capital letter H. You then iteratively place smaller H’s centred at the top and bottom of each free line segment. This article shows how to generate H-Fractals with the R language.

The H-Fractal or H-Tree is a self-similar fractal with ever-smaller line segments. This fractal is a Paeno Curve, which means that it eventually will fill a whole area and becomes a 2-dimensional object. The H-Fractal is a canopy fractal, a type of graph where a line segment is split into smaller lines at the end. Fractal canopies are very useful in creating models of plants.

The H-Fractal principle has practical applications in electronics. For example, microstrip antennae are printed on circuit boards and resemble the tree structure in this fractal. In addition, the splitting of fractal canopies is similar to the structure of bronchial tubes in the human body. A US Patent from 2006 lists a H-Fractal as the geometry for a microwave antenna.

H-Fractal with five iterations
H-Fractal with five iterations.

Method

The algorithm starts with a horizontal line on the interval $[-1,1]$. Each iteration adds new shortened lines to the ends of the existing lines. The first iteration results in a shape that resembles the letter H. After that, the direction of the lines switches at each iteration from horizontal to vertical.

If the number of iterations of the fractal is $p$, then each iteration adds $2^p$ lines to the tree, and the total number of lines in the fractal is $2^{p+1} + 1$.

The new lines are shortened by a factor, which is set at $\frac{1}{\sqrt{2}}$. If you set it any higher, the lines will overlap—a lower value results in a more sparse design.

Generate H-Fractals with ggplot

The code below starts with setting the initial variables and defines the first line in a data frame. The data frame holds the start and end coordinates and the iteration number.

  library(ggplot2)
  ## H-Fractal Parameters
  p <- 8 ## Number of iterations
  a <- 1 / sqrt(2) ## Shortening parameter
  
  ## Define horizontal starting line
  h_fractal <- data.frame(x1 = -1,
                          y1 = 0,
                          x2 = 1,
                          y2 = 0,
                          m = 0)

The loop defines the iterations and adds a new row to the data frame for each line. First, the direction flips by setting the dx and dy values to either 0 or 1. The second part defines the row numbers for the previously defined lines and the new lines. The code then calculates the coordinates for the new line segments.

  # Generate coordinates (each line on a row)
  for (m in 1:p) {
    ## Flip direction
    dx <- (m - 1) %% 2
    dy <- m %% 2
    # Previous and current line numbers
    i <- (2^(m - 1)):(2^m - 1)
    j <- (2^m):(2^(m + 1) - 1)
    ## Calculate coordinates
    h_fractal[j, "x1"] <- c(h_fractal[i, "x1"] - dx * a^m, h_fractal[i, "x2"] - dx * a^m)
    h_fractal[j, "x2"] <- c(h_fractal[i, "x1"] + dx * a^m, h_fractal[i, "x2"] + dx * a^m)
    h_fractal[j, "y1"] <- c(h_fractal[i, "y1"] - dy * a^m, h_fractal[i, "y2"] - dy * a^m)
    h_fractal[j, "y2"] <- c(h_fractal[i, "y1"] + dy * a^m, h_fractal[i, "y2"] + dy * a^m)
    ## Set line property
    h_fractal[j, "m"] <- m
  }

Lastly, The fractal is visualised with ggplot and the line segment geometry. The colour of the line slowly fades by setting it to the iteration number.

    ## Visualise
  ggplot(h_fractal) + 
    aes(x = x1, y = y1, xend = x2, yend = y2,
        col = m) +
    geom_segment(size = .5) +
    scale_size(guide = NULL) +
    scale_colour_gradientn(colours = gray.colors(p), guide = NULL) + 
    theme_void()
H-Fractal example with twelve iterations
H-Fractal with twelve iterations.

Variations on the Theme

Besides changing the number of iterations and the shortening factor, you can also play with line thickness, colours, and the lines’ direction. This Shiny application lets you play with all variables in this algorithm to generate

Share this content

You might also enjoy reading these articles

Project Euler 35: Circular Primes below One Million

Mapping the Ancient World: A Digital Odyssey through Ptolemy's Geography

Simulating Text Files with R to Test the Emacs Denote Package