Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Let’s play with some dragons. Dragons from the Jurassic park or the board game dungeon and dragons.

The algorithm is a fractal curve of Hausdorff dimension 2. One starts with one segment. In each iteration the number of segments is doubled by taking each segment as the diagonal of a square and replacing it by half the square (90 degrees). Alternating and doing the left and right function / direction to complement in order to get the shape.

Assume that we start with just a horizontal line (called Dn) as a segment. Since we created two dragons, we will introduce another line (called Cn, which is a derivate of Dn+1). The Dn+1 is obtained from Dn as follows:
1) Translate Dn, moving its end point to the origin.
2) Multiply the translated copy by √1/2.
3) Rotate the result of previous step by −45◦ degrees and call the result Cn.
3) Rotate Cn by −90◦ degrees and join this rotated copy to the end of Cn to get Dn+1.

Translate this to the function, we get the following IFS (iterated function system).

```# Function to generate points using IFS
generate_dragon_curve <- function(iterations) {
# Initial point
points <- complex(real = 0, imaginary = 0)
colors <- c() # Vector to store colors

# two iterated functions; each for own direction
f1 <- function(z) {      (1 + 1i) * z / 2 }
f2 <- function(z) {  1 - (1 - 1i) * z / 2 }

# iterate to generate points
for (i in 1:iterations) {
new_points <- vector("complex", length = length(points) * 2)
new_colors <- vector("character", length = length(points) * 2)
for (j in 1:length(points)) {
new_points[2 * j - 1] <- f1(points[j])
new_colors[2 * j - 1] <- ifelse(i %% 2 == 1, "blue", "red") # Alternating colors
new_points[2 * j] <- f2(points[j])
new_colors[2 * j] <- ifelse(i %% 2 == 1, "red", "blue") # Alternating colors
}
points <- new_points
colors <- c(colors, new_colors)
}

return(list(points = points, colors = colors))
}
```

Once we have the points, we need to plot the points with corresponding numbers.

```plot_dragon_curve <- function(iterations) {
result <- generate_dragon_curve(iterations)
points <- result\$points
colors <- result\$colors
plot(Re(points), Im(points), type = "p", pch = ".", col = colors, asp = 1, labels=FALSE, yaxt="n", xaxt="n",
xlab = "", ylab = "", main = paste("Heighway Dragon Curve with", iterations, "iterations"))
}
```

And lastly, execute the function (in this case with 15 iterations):

```plot_dragon_curve(15)
```

This plots the dragon curve.

As always, the complete code is available on GitHub in  Useless_R_function repository. The sample file in this repository is here (filename: Two_dragon_fractal.R). Check the repository for future updates.

Happy R-coding and stay healthy!