Created
September 30, 2019 16:57
-
-
Save dewittpe/a1bf936c419a96fd06aa6c3e07dc718f to your computer and use it in GitHub Desktop.
Padovan Sequence and sierpinski trianagles
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library(ggplot2) | |
library(magrittr) | |
library(parallel) | |
# Padovan Sequence | |
# 1, 1, 1, 2, 2, 3, 4, ... | |
padovan <- function(n) { | |
n <- floor(n) | |
if (n <= 3) stop("n needs to be an integer greater than 3") | |
x <- integer(n) | |
x[1:3] <- c(1, 1, 1) | |
for( i in seq(4, n, by = 1) ) { | |
x[i] <- x[i - 2] + x[i - 3] | |
} | |
x | |
} | |
padovan(25) | |
sierpinski <- function(x, depth = 0) { | |
if (depth < 0 | depth > 10) stop() | |
if (depth == 0) | |
{ | |
x[["tri"]] <- runif(1) | |
return(x) | |
} else { | |
va <- x[1, c("x", "y")] | |
vb <- x[2, c("x", "y")] | |
vc <- x[3, c("x", "y")] | |
mab <- data.frame(x = mean(c(va$x, vb$x)), y = mean(c(va$y, vb$y))) | |
mac <- data.frame(x = mean(c(va$x, vc$x)), y = mean(c(va$y, vc$y))) | |
mbc <- data.frame(x = mean(c(vb$x, vc$x)), y = mean(c(vb$y, vc$y))) | |
do.call(rbind, | |
list( | |
sierpinski(data.frame(x = c(va$x, mab$x, mac$x), y = c(va$y, mab$y, mac$y)), depth = depth - 1), | |
sierpinski(data.frame(x = c(mab$x, vb$x, mbc$x), y = c(mab$y, vb$y, mbc$y)), depth = depth - 1), | |
sierpinski(data.frame(x = c(mac$x, mbc$x, vc$x), y = c(mac$y, mbc$y, vc$y)), depth = depth - 1) | |
) | |
) | |
} | |
} | |
# starting at the origin | |
vertices <- | |
list( | |
v1 = data.frame(x = 0.0, y = 0.0), | |
v2 = data.frame(x = 0.5, y = sin(pi / 3)), | |
v3 = data.frame(x = 1.0, y = 0.0), | |
v4 = data.frame(x = 0.5, y = -sin(pi / 3)), | |
v5 = data.frame(x = -0.5, y = -sin(pi / 3)) | |
) | |
vertices$v6$x <- vertices$v5$x - 1 | |
vertices$v6$y <- vertices$v2$y | |
vertices$v7$x <- vertices$v5$x | |
vertices$v7$y <- vertices$v2$y + 2 * sin(pi / 3) | |
vertices$v8$x <- vertices$v7$x + 3 | |
vertices$v8$y <- vertices$v7$y | |
vertices$v9$x <- vertices$v4$x + 4 | |
vertices$v9$y <- vertices$v4$y | |
vertices$v10$x <- mean(c(vertices$v5$x, vertices$v9$x)) | |
vertices$v10$y <- vertices$v9$y - 5 * sin(pi / 3) | |
vertices$v11$x <- vertices$v10$x - 7 | |
vertices$v11$y <- vertices$v10$y | |
padovan(10) | |
vertices$v12$x <- vertices$v7$x - 9 | |
vertices$v12$y <- vertices$v7$y | |
padovan(11) | |
vertices$v13$x <- mean(c(vertices$v12$x, vertices$v8$x)) | |
vertices$v13$y <- vertices$v7$y + 12 * sin(pi / 3) | |
padovan(12) | |
vertices$v14$x <- vertices$v13$x + 16 | |
vertices$v14$y <- vertices$v13$y | |
vertices <- dplyr::bind_rows(vertices, .id = "vertex") | |
triangles <- | |
list( | |
t001 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v1", "v2", "v3")), padovan = 1), | |
t002 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v1", "v3", "v4")), padovan = 1), | |
t003 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v1", "v4", "v5")), padovan = 1), | |
t004 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v5", "v6", "v2")), padovan = tail(padovan(4), 1)), | |
t005 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v6", "v2", "v7")), padovan = tail(padovan(5), 1)), | |
t006 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v7", "v3", "v8")), padovan = tail(padovan(6), 1)), | |
t007 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v8", "v9", "v4")), padovan = tail(padovan(7), 1)), | |
t008 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v5", "v9", "v10")), padovan = tail(padovan(8), 1)), | |
t009 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v6", "v10", "v11")), padovan = tail(padovan(9), 1)), | |
t010 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v7", "v11", "v12")), padovan = tail(padovan(10), 1)), | |
t011 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v12", "v13", "v8")), padovan = tail(padovan(11), 1)), | |
t012 = dplyr::mutate(dplyr::filter(vertices, .data$vertex %in% c("v13", "v9", "v14")), padovan = tail(padovan(12), 1)) | |
) | |
triangles <- | |
triangles %>% | |
unname %>% | |
dplyr::bind_rows(., .id = "n") %>% | |
dplyr::mutate(n = as.numeric(n)) | |
ggplot() + | |
theme_bw() + | |
# theme_dark() + | |
# theme_minimal() + | |
aes(x = x, y = y) + | |
geom_polygon(data = triangles, mapping = aes(group = n), color = "black") + | |
# geom_text(data = vertices, mapping = aes(label = vertex)) + | |
geom_text(data = dplyr::summarize(dplyr::group_by(triangles, n, padovan), x = mean(x), y = mean(y)), | |
mapping = aes(x = x, y = y, group = n, label = padovan), color = 'white') + | |
coord_equal() + | |
guides(fill = FALSE) + | |
theme( | |
axis.title = element_blank(), | |
axis.text = element_blank(), | |
axis.ticks = element_blank(), | |
axis.line = element_blank(), | |
panel.border = element_blank(), | |
panel.grid = element_blank() | |
) + | |
ggtitle("Padovan Sequence") | |
mclapply(unique(triangles$n), function(nn) { sierpinski(dplyr::filter(triangles, n == nn), depth = 7) }, | |
mc.cores = 10L) %>% | |
dplyr::bind_rows(., .id = "pad_seq") %>% | |
ggplot(.) + | |
theme_bw() + | |
aes(x = x, y = y, group = tri, fill = pad_seq) + | |
geom_polygon() + | |
coord_equal()+ | |
guides(fill = FALSE) + | |
theme( | |
axis.title = element_blank(), | |
axis.text = element_blank(), | |
axis.ticks = element_blank(), | |
axis.line = element_blank(), | |
panel.border = element_blank(), | |
panel.grid = element_blank() | |
) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment