Blue Vorontex #47
Polær Voronoi Tesselering
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)
<- 100
tiler <- rnorm(tiler)
x <- rnorm(tiler) y
Tesseleringerne kaldes på engelsk “tiles”. Dem beregner jeg, og samler dem i en dataframe:
<- deldir(x, y)
tesselation <- tile.list(tesselation)
tiles <- data.frame(x=x, y=y)
points <- lapply(tiles, function(tile){
tiles_df 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")