Sunday, November 05, 2023

x̄ - > Line replacement fractals and shape replacement fractals.

 Line-replacement fractals, also known as iterated function system (IFS) fractals, can be created by repeatedly applying iteration rules on curves. One famous example is the Koch snowflake. Here's an R programming example for computing properties of the Koch snowflake fractal:


```R

# Load necessary libraries

library(ggplot2)


# Define the initial segment of the Koch snowflake

initial_segment <- data.frame(x = c(0, 1), y = c(0, 0))


# Function to generate the next level of the Koch snowflake

generate_koch_segment <- function(segment) {

  x <- segment$x

  y <- segment$y

  new_x <- c(x[1], (2*x[1] + x[2]) / 3, (x[1] + x[2]) / 2, (x[1] + 2*x[2]) / 3, x[2])

  new_y <- c(y[1], (2*y[1] + y[2]) / 3, (y[1] + y[2]) / 2, (y[1] + 2*y[2]) / 3, y[2])

  return(data.frame(x = new_x, y = new_y))

}


# Generate the Koch snowflake by applying the rules iteratively

koch_snowflake <- initial_segment

for (i in 1:5) {  # Increase the number of iterations for a more detailed snowflake

  koch_snowflake <- lapply(1:(length(koch_snowflake) - 1), 

                            function(j) generate_koch_segment(koch_snowflake[[j]]))

  koch_snowflake <- do.call(rbind, koch_snowflake)

}


# Plot the Koch snowflake

ggplot(koch_snowflake, aes(x, y)) +

  geom_path() +

  labs(title = "Koch Snowflake Fractal", x = "", y = "") +

  theme_minimal()

```


This code defines the initial segment of the Koch snowflake and a function to generate the next level of segments based on the Koch fractal's rules. It then iteratively applies these rules to create a detailed snowflake.


You can adjust the number of iterations and the parameters of the fractal to create more complex or detailed fractals. The code also uses the `ggplot2` library to create a visualization of the fractal.


Shape-replacement fractals, also known as L-systems (Lindenmayer systems), are created by repeatedly applying iteration rules on shapes or strings. Let's explore an example of generating a fractal tree using R and compute some properties such as the number of segments and the total length of the tree:


```R

# Load necessary libraries

library(ggplot2)


# Define the initial axiom and rules for the L-system

axiom <- "X"

rules <- list(

  "X" = "F+[[X]-X]-F[-FX]+X",

  "F" = "FF"

)


# Function to generate the L-system string

generate_l_system <- function(axiom, rules, iterations) {

  l_system <- axiom

  for (i in 1:iterations) {

    l_system <- gsub(pattern = names(rules), replacement = rules, x = l_system)

  }

  return(l_system)

}


# Function to compute the properties of the L-system

compute_l_system_properties <- function(l_system, length_per_iteration) {

  num_segments <- sum(l_system == "F")

  total_length <- num_segments * length_per_iteration

  return(list(

    "Number of Segments" = num_segments,

    "Total Length" = total_length

  ))

}


# Generate the L-system string and compute properties

iterations <- 4  # Adjust the number of iterations for a more detailed tree

l_system_string <- generate_l_system(axiom, rules, iterations)

properties <- compute_l_system_properties(l_system_string, length_per_iteration = 10)  # Length per iteration


# Print the properties

for (prop in names(properties)) {

  cat(prop, ": ", properties[[prop]], "\n")

}


# Create a visualization of the L-system (fractal tree)

x <- 0

y <- 0

angle <- 90

stack <- data.frame(x = numeric(0), y = numeric(0))


segments <- data.frame(x = numeric(0), y = numeric(0))

for (symbol in strsplit(l_system_string, NULL)[[1]]) {

  if (symbol == "F") {

    x <- x + cos(angle * pi / 180)

    y <- y + sin(angle * pi / 180)

    segments <- rbind(segments, data.frame(x = x, y = y))

  } else if (symbol == "+") {

    angle <- angle + 25

  } else if (symbol == "-") {

    angle <- angle - 25

  } else if (symbol == "[") {

    stack <- rbind(stack, data.frame(x = x, y = y))

  } else if (symbol == "]") {

    n <- nrow(stack)

    if (n > 0) {

      x <- stack[n, "x"]

      y <- stack[n, "y"]

      stack <- stack[-n, ]

    }

  }

}


ggplot(segments, aes(x, y)) +

  geom_path() +

  labs(title = "Fractal Tree (L-System)") +

  theme_minimal()

```


In this code, we define the axiom and rules for an L-system representing a fractal tree. The `generate_l_system` function iteratively applies the rules to generate the L-system string. Then, we compute the number of segments and the total length of the tree using the `compute_l_system_properties` function. Finally, we create a visualization of the fractal tree using ggplot2. You can adjust the number of iterations for a more detailed tree and other parameters to create different shapes.


No comments:

Meet the Authors
Zacharia Maganga’s blog features multiple contributors with clear activity status.
Active ✔
πŸ§‘‍πŸ’»
Zacharia Maganga
Lead Author
Active ✔
πŸ‘©‍πŸ’»
Linda Bahati
Co‑Author
Active ✔
πŸ‘¨‍πŸ’»
Jefferson Mwangolo
Co‑Author
Inactive ✖
πŸ‘©‍πŸŽ“
Florence Wavinya
Guest Author
Inactive ✖
πŸ‘©‍πŸŽ“
Esther Njeri
Guest Author
Inactive ✖
πŸ‘©‍πŸŽ“
Clemence Mwangolo
Guest Author

Followers

Support This Blog
Tap Donate now here to donate or go to donate on top menu to scan QR and support this site.
Donate Now