Little useless-useful R functions – Dragon curve
This article is originally published at https://tomaztsql.wordpress.com
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!
Thanks for visiting r-craft.org
This article is originally published at https://tomaztsql.wordpress.com
Please visit source website for post related comments.