Blue Vorontex #47

Polær Voronoi Tesselering

Generativ Kunst
R
Forfatter

Christian Knudsen

Udgivet

9. juni 2024

En voronoi tesselering med 100 celler i polære koordinater

Grundlæggende: Vælg 100 tilfældige punkter i et plan. Tegn derefter polygoner omkring disse punkter, således at alle punkter i planet der er tættest på et bestemt af de 100 tilfældige punkter, er indeholdt i polygonen der hører til punktet.

Den slags har praktisk anvendelse i en del sammenhænge. Byplanlægning, hvor man eksempelvis forsøger at maksimere befolkningens adgang til faciliteter. Biologer bruger det når de modellerer territorial adfærd hos dyr.

Den gemmer sig også i kerne af visse algoritmer til clustering, blandt andet k-means.

Som altid skal jeg bruge tidyverse, og dertil deldir pakken, der håndterer den egentlige tesselering.

library(tidyverse)
library(deldir)

Så genererer jeg tilfældige punkter. Men ikke mere tilfældige end at jeg kan reproducere dem:

set.seed(47)
tiler <- 100
x <- rnorm(tiler)
y <- rnorm(tiler)

Tesseleringerne kaldes på engelsk “tiles”. Dem beregner jeg, og samler dem i en dataframe:

tesselation <- deldir(x, y)
tiles <- tile.list(tesselation)
points <- data.frame(x=x, y=y)
tiles_df <- lapply(tiles, function(tile){
  data.frame(x=tile$x, y = tile$y)
}) %>% 
  bind_rows(.id = "tile_id")

Endelig plotter jeg det. Bemækr at jeg transformerer koordinatsystemet til polære koordinater:

tiles_df %>% 
  ggplot(aes(x = x, y = y, group = tile_id, fill = tile_id)) +
  geom_polygon() +
  theme_minimal() +
  coord_polar(start = 0.47) +
  theme(legend.position = "none" ,
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.line = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank()) +
        scale_fill_manual(values = hcl.colors(tiler, "Blues 3")) +
        theme(legend.position = "none")

ggsave("Blue_Vorontex-47.png")