
o.T. (carré noir)
Vera Molnár
            posit::conf(2023)
          


geom_polygon()We will use the following aesthetics
x, y)color)fill)group)geom_polygon()We will use the following aesthetics
x, y)color)fill)group)geom_polygon() tips
Order of coordinates matters (a lot!)
Only coordinates of interest are the vertices
exercises/03-ot/exercise.Rmdexercises/03-ot/letters/ and draw out the letter.tribble() with the coordinates of the letter you selected.create_letter(), that takes x0 and y0 as arguments and moves the shape according to those arguments.x0 and y0 of your choosing.10:00
Throughout her career, Vera Molnár experimented with repetitions and variations of letters, especially the letter M – as in Molnár.
She explored the balance between order and chaos.

y_new = -x_old & x_new = y_oldy_new = -y_old & x_new = -x_oldy_new = x_old & x_new = -y_old
x0 <- 3
y0 <- 3
initial_u_shape <-
  create_initial_shape(x0, y0) %>%
  mutate(
    x = x - x0,
    y = y - y0
  ) %>%
  mutate(
    x_new = y,
    y_new = -x
  )
initial_u_shape %>%
  ggplot() +
  geom_polygon(
    aes(
      x = x_new,
      y = y_new
    )
  ) +
  geom_point(
    aes(
      x = x0,
      y = y0
    ),
    size = 5,
    color = "red"
  ) +
  coord_fixed(
    xlim = c(-1, 4),
    ylim = c(-1, 4)
  )
x0 <- 3
y0 <- 3
initial_u_shape <-
  create_initial_shape(x0, y0) %>%
  mutate(
    x = x - x0,
    y = y - y0
  ) %>%
  mutate(
    x_new = y,
    y_new = -x
  ) %>%
  mutate(
    x = x_new + x0,
    y = y_new + y0
  )
initial_u_shape %>%
  ggplot() +
  geom_polygon(
    aes(
      x = x,
      y = y
    )
  ) +
  geom_point(
    aes(
      x = x0,
      y = y0
    ),
    size = 5,
    color = "red"
  ) +
  coord_fixed(
    xlim = c(-1, 4),
    ylim = c(-1, 4)
  )
x0 <- 3
y0 <- 3
shape_width <- 1
initial_u_shape <-
  create_initial_shape(x0, y0) %>%
  mutate(
    x = x - x0,
    y = y - y0
  ) %>%
  mutate(
    x_new = y,
    y_new = -x
  ) %>%
  mutate(
    x = x_new + x0,
    y = y_new + y0 + shape_width
  )
initial_u_shape %>%
  ggplot() +
  geom_polygon(
    aes(
      x = x,
      y = y
    )
  ) +
  geom_point(
    aes(
      x = x0,
      y = y0
    ),
    size = 5,
    color = "red"
  ) +
  coord_fixed(
    xlim = c(-1, 4),
    ylim = c(-1, 4)
  )
rotate_shape <- function(data, x0, y0, degrees, shape_width) {
  if (degrees == 90) {
    data %>%
      mutate(
        x = x - x0,
        y = y - y0
      ) %>%
      mutate(
        x_new = y,
        y_new = -x
      ) %>%
      mutate(
        x = x_new + x0,
        y = y_new + y0 + shape_width
      )
  } else if (degrees == 180) {
    data %>%
      mutate(
        x = x - x0,
        y = y - y0
      ) %>%
      mutate(
        x_new = -x,
        y_new = -y
      ) %>%
      mutate(
        x = x_new + x0 + shape_width,
        y = y_new + y0 + shape_width
      )
  } else if (degrees == 270) {
    data %>%
      mutate(
        x = x - x0,
        y = y - y0
      ) %>%
      mutate(
        x_new = -y,
        y_new = x
      ) %>%
      mutate(
        x = x_new + x0 + shape_width,
        y = y_new + y0
      )
  } else if (degrees == 0) {
    data
  }
}exercises/03-ot/exercise.Rmdinitiate_rotate_shape() function.x0, y0, and the degrees argument within initiate_rotate_shape() to rotate and move your letter.shape_width to be greater or smaller than 1? Why does this happen?05:00
# A tibble: 100 × 2
       x     y
   <dbl> <dbl>
 1     0  0   
 2     0  1.25
 3     0  2.5 
 4     0  3.75
 5     0  5   
 6     0  6.25
 7     0  7.5 
 8     0  8.75
 9     0 10   
10     0 11.2 
# ℹ 90 more rows
ncol <- 10
nrow <- 10
shape_width <- 1
perimeter_width <- shape_width + .25
grid <-
  expand_grid(
    x = seq(0,
      by = perimeter_width,
      length.out = ncol
    ),
    y = seq(0,
      by = perimeter_width,
      length.out = nrow
    )
  ) %>%
  mutate(y = if_else(x >= 5 * perimeter_width,
    y + perimeter_width / 2,
    y
  ))
grid# A tibble: 100 × 2
       x     y
   <dbl> <dbl>
 1     0  0   
 2     0  1.25
 3     0  2.5 
 4     0  3.75
 5     0  5   
 6     0  6.25
 7     0  7.5 
 8     0  8.75
 9     0 10   
10     0 11.2 
# ℹ 90 more rows
library(purrr)
make_molnar_system <- function() {
  ncol <- 10
  nrow <- 10
  shape_width <- 1
  perimeter_width <- shape_width + .25
  grid <-
    expand_grid(
      x = seq(0, by = perimeter_width, length.out = ncol),
      y = seq(0, by = perimeter_width, length.out = nrow)
    ) %>%
    mutate(y = if_else(x >= 5 * perimeter_width,
      y + perimeter_width / 2,
      y
    ))
  output <-
    map_dfr(
      1:nrow(grid),
      function(i) {
        create_rotate_shape(
          x = grid$x[i],
          y = grid$y[i],
          degrees = 180,
          shape_width = shape_width
        )
      }
    )
  return(output)
}geom_polygon()We will use the following aesthetics
x, y)color)fill)group)make_molnar_system <- function() {
  ncol <- 10
  nrow <- 10
  shape_width <- 1
  perimeter_width <- shape_width + .25
  grid <-
    expand_grid(
      x = seq(0, by = perimeter_width, length.out = nrow),
      y = seq(0, by = perimeter_width, length.out = ncol)
    ) %>%
    mutate(y = if_else(x >= 5 * perimeter_width,
      y + perimeter_width / 2,
      y
    ))
  output <-
    map_dfr(
      1:nrow(grid),
      function(i) {
        bind_cols(
          group = i,
          create_rotate_shape(
            x = grid$x[i],
            y = grid$y[i],
            degrees = 180,
            shape_width = shape_width
          )
        )
      }
    )
  return(output)
}make_molnar_system <- function(seed) {
  set.seed(seed)
  ncol <- 10
  nrow <- 10
  shape_width <- 1
  perimeter_width <- shape_width + .25
  grid <-
    expand_grid(
      x = seq(0, by = perimeter_width, length.out = nrow),
      y = seq(0, by = perimeter_width, length.out = ncol)
    ) %>%
    mutate(y = if_else(x >= 5 * perimeter_width,
      y + perimeter_width / 2,
      y
    ))
  output <-
    map_dfr(
      1:nrow(grid),
      function(i) {
        bind_cols(
          group = i,
          create_rotate_shape(
            x = grid$x[i],
            y = grid$y[i],
            degrees = 180,
            shape_width = shape_width
          )
        )
      }
    )
  return(output)
}make_molnar_system <- function(seed) {
  set.seed(seed)
  ncol <- 10
  nrow <- 10
  shape_width <- 1
  perimeter_width <- shape_width + .25
  grid <-
    expand_grid(
      x = seq(0, by = perimeter_width, length.out = nrow),
      y = seq(0, by = perimeter_width, length.out = ncol)
    ) %>%
    mutate(y = if_else(x >= 5 * perimeter_width,
      y + perimeter_width / 2,
      y
    ))
  output <-
    map_dfr(
      1:nrow(grid),
      function(i) {
        bind_cols(
          group = i,
          create_rotate_shape(
            x = grid$x[i],
            y = grid$y[i],
            degrees = sample(c(0, 90, 180, 270),
              size = 1
            ),
            shape_width = shape_width
          )
        )
      }
    )
  return(output)
}




Layout: 1, 2, 3, Skip, 4, 1, 2

make_molnar_system <-
  function(seed) {
    set.seed(seed)
    ncol <- 10
    nrow <- 10
    shape_width <- 1
    perimeter_width <- shape_width + .25
    degree_pattern_options <- c(0, 90, 180, 270)
    degree_pattern <- sample(degree_pattern_options, size = 6, replace = TRUE)
    grid <-
      expand_grid(
        x = seq(0,
          by = perimeter_width,
          length.out = nrow
        ),
        y = seq(0,
          by = perimeter_width,
          length.out = ncol
        )
      ) %>%
      mutate(y = if_else(x >= 5 * perimeter_width,
        y + perimeter_width / 2,
        y
      ))
    degree_pattern_exp <- rep(degree_pattern,
      length.out = nrow(grid)
    )
    output <-
      map_dfr(
        1:nrow(grid),
        function(i) {
          bind_cols(
            group = i,
            create_rotate_shape(
              x = grid$x[i],
              y = grid$y[i],
              degrees = degree_pattern_exp[i],
              shape_width = shape_width
            )
          )
        }
      )
    return(output)
  }

exercises/03-ot/exercise.Rmdmake_exercise_molnar() function which encompasses the whole system.degree_pattern_options= and degree_sample_size= for the function make_exercise_molnar() to experiment with modifying the rotation patterns to one of your choice. (Degrees options are 0, 90, 80, 270)ggsave() code provided and share on GitHub discussion board.fill= and color= in geom_polygon()plot.background in theme()10:00
geom_polygon()geom_polygon() arguments: order matters and group is important!