
Pi-walk
Walking the pie
Efter kraftig inspiration fra den talentfulde Naideh Bremer.
Ideen er :
Start et eller andet sted i koordinatsystemet. Betragt det første ciffer af pi, og gå et skridt i en retning specificeret af det ciffer. Betragt det næste ciffer, og tag et nyt skridt i en retning specificeret af det ciffer.
Gentag 1000000 trin.
Først - hvilken retning skal et givet ciffer pege i?:
x <- cos(5/2*pi - digit/5*pi)
y <- sin(5/2*pi - digit/5*pi)Det giver os et x,y skridt, baseret på cifferet.
Hvis vi tager to trin, vil x-positionen ende med at være summen af de to skridts x-komponent. Tilsvarende med y-positionen.
Derfor kan vi beregne en position efter skridt n ved at beregne den kumulerede sum af x og y.
Vi skal stadig tilføje (0,0) i begyndelsen - der hvor vi starter spadsereturen.
Hvis vi får fingre i pi som en tekststreng, kan vi gøre alt dette, og returnere en tibble:
library(tidyverse)
piPoints <- function(piString){
# fjern punktum/decimalkomma
numbers <- paste0(substr(piString, 1, 1), substr(piString, 3, nchar(piString)))
# Split strengen i individuelle tegn, og coerce til heltal
numbers <- as.integer(unlist(strsplit(numbers,"")))
# Beregn hvert enkelt skridts x og y komponent
x <- cos(5/2*pi - numbers/5*pi)
y <- sin(5/2*pi - numbers/5*pi)
# Beregn den kumulative sum
x <- cumsum(x)
y <- cumsum(y)
# Tilføj startpunkt
x <- c(0,x)
y <- c(0,y)
# Tilføj et rækkenummer eller id for kontinuerlig farvelægning
id <- 1:(length(y))
# Saml og returner tibble
tibble(x=x,y=y, id = id)
}Så skal vi have fingre i pi med en milliion decimaler
large_pi <- read_file("https://pi2e.ch/blog/wp-content/uploads/2017/03/pi_dec_1m.txt")Det hælder vi ind i funktionen:
df <- piPoints(large_pi)Plot - og gem.
ggplot(df, aes(x,y,group="1")) +
geom_path(aes(colour=id)) +
scale_colour_distiller(type="seq", palette="Set1") +
theme_bw() +
coord_fixed(ratio = 1) +
theme(line = element_blank(),
text = element_blank(),
title = element_blank(),
legend.position="none",
panel.border = element_blank(),
panel.background = element_blank())
ggsave("piwalk.png") Der er adskellige andre matematiske konstanter vi kunne gøre det med. Og vi kan også variere resultatet ved at justere på de individuelle skridt. For nuværende er jeg ganske godt tilfreds med resultatet.