When Two Points on a Circle Form a Line

There are many ways to produce computer created abstract images. I show you one them written in R, that leads to images like these:

First of all, let’s set the stage with a config part:

#### load packages
#### instead of tidyverse you can also use just ggplot2, purrr and magrittr
library(here)
library(tidyverse)

####
#### Utils functions neccessary: 
#### You can find them in the generativeart package on Github: github.com/cutterkom/generativeart.
#### Here they are stored in `src/generate_img.R`.
####
source(here("src/generate_img.R"))
NR_OF_IMG <- 1
LOGFILE_PATH <- "logfile/logfile.csv"

The base concept is:

  • form a starting distribution of the points
  • transform the data

In this case, our starting point is a circle. I create the data with a formula called get_circle_data(). The function was proposed on Stackoverflow by Joran Elias.

get_circle_data <- function(center = c(0,0), radius = 1, npoints = 100){
  tt <- seq(0, 2*pi, length.out = npoints)
  xx <- center[1] + radius * cos(tt)
  yy <- center[2] + radius * sin(tt)
  return(data.frame(x = xx, y = yy))
}

The circle dataframe goes straight into a generate_data(), where every point on the circle is connected to excatly one other point. The connections between a pair of coordinates are based on randomness, see sample(nrow(df2)):

generate_data <- function() {
  print("generate data")
  df <- get_circle_data(c(0,0), 1, npoints = 100)
  df2 <- df %>% 
    mutate(xend = x,
           yend = y) %>% 
    select(-x, -y)
  df2 <- df2[sample(nrow(df2)),]
  df <- bind_cols(df, df2)
  return(df)
} 

The dataframe is input to a ggplot::geom_segment() plotting function:

generate_plot <- function(df, file_name, coord) {
  print("generate plot")
  plot <- df %>% 
    ggplot() +
    geom_segment(aes(x = x, y = y, xend = xend, yend = yend), color = "black", size = 0.25, alpha = 0.6) +
    theme_void() +
    coord_equal()
  
  print("image saved...")
  plot
}

Now we have all parts gathered to run the wrapper function generate_img from the generativeart package that indeed creates an image:

generate_img()

From here, you can play with the input parameters to generate different looking images. You can change these variables in get_circle_data():

  • center = c(0,0): changes nothing when you draw only one circle, the center can be anywhere
  • radius = 1: numbers greater than 1 for rings within the circle
  • npoints = 100: Higher numbers for denser circle lines

You can find the code in an .Rmd script on Github.

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.