Created
June 23, 2014 18:13
-
-
Save johnbaums/c0b90ab1d6a29599359a to your computer and use it in GitHub Desktop.
Generating identicons for fun and profit
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
| # PHP source at http://scott.sherrillmix.com/blog/blogger/wp_identicon/ | |
| # http://www.gravatar.com/avatar/b1554c62bf1d05a4a9c48754a6619c17.png?d=identicon | |
| # Related SO post: http://stackoverflow.com/q/24347608/489704 | |
| # Download and read in PHP source for shape creation | |
| download.file('http://downloads.wordpress.org/plugin/wp-identicon.zip', | |
| destfile=f <- tempfile()) | |
| unzip(f, exdir=tempdir()) | |
| txt <- readLines(file.path(tempdir(), 'wp-identicon', 'wp_identicon.php'), | |
| warn=FALSE)[55:98] | |
| # Clean up and convert PHP nested arrays to R nested lists | |
| txt <- gsub('\\$this->', '', | |
| gsub('array', 'list', | |
| gsub('array\\((?!array)', 'c(', | |
| paste('list(', paste(sub(',//.*', '', txt), | |
| collapse=','), ')'), | |
| perl=TRUE))) | |
| identicon.units <- list(quarter=0.25, half=0.5, diagonal=sqrt(2 * 0.5^2), | |
| halfdiag=sqrt(2 * 0.5^2)/2) | |
| # Create a list of angles and distance representing polygons | |
| # (object dput at bottom of this gist) | |
| identicon.shapes <- | |
| lapply(eval(parse(text=txt), envir=identicon.units), function(x) { | |
| lapply(x, function(y) { | |
| do.call(rbind, y) | |
| }) | |
| }) | |
| # Function to get coordinates given angle and distance | |
| get.coords <- function(a, d, flip='n') { | |
| if (!flip %in% c('h', 'v', 'n')) | |
| stop('flip must be "n" (none), "h" (horizontal) or "v" (vertical)') | |
| d2 <- d | |
| if (flip=='h') d <- -d | |
| if (flip=='v') d2 <- -d2 | |
| cbind(-d*cos((-a+90) * pi/180), -d2*sin((-a+90) * pi/180)) | |
| } | |
| # Function to plot a single block | |
| identiblock <- function(shp, col='black', bg='white', rotate=0, flip='n', | |
| invert=FALSE) { | |
| if (!rotate %in% c(0, 90, 180, 270)) | |
| stop('Rotation must be 0, 90, 180 or 270') | |
| plot.new() | |
| plot.window(xlim=c(-0.5, 0.5), ylim=c(-0.5, 0.5), xaxs='i', yaxs='i', asp=1) | |
| rect(-0.5, -0.5, 0.5, 0.5, col=ifelse(isTRUE(invert), col, bg), border=NA) | |
| invisible(sapply(identicon.shapes[[shp]], function(x) { | |
| x[, 1] <- x[, 1] + rotate | |
| polygon(get.coords(x[, 1], x[, 2], flip=flip), | |
| col=ifelse(isTRUE(invert), bg, col), border=NA) | |
| })) | |
| } | |
| identiblock(7) | |
| identiblock(7, flip='h') | |
| identiblock(7, rotate=90) | |
| identiblock(7, invert=TRUE) | |
| # All standard identicon shapes | |
| png(f <- tempfile(fileext='.png'), width=525, height=105, type='cairo') | |
| par(mfrow=c(3, 15), mar=rep(0.1, 4)) | |
| invisible(sapply(seq_along(identicon.shapes), function(i) { | |
| identiblock(i) | |
| })) | |
| dev.off() | |
| file.show(f) | |
| # Function to create an identicon | |
| # In reality randomisation is more complicated | |
| identicon <- function(seed) { | |
| if(!is.numeric(seed)) { | |
| require(digest) | |
| seed <- eval(parse(text=paste0('0x', substr(digest(seed, 'sha1'), 1, 7)))) | |
| } | |
| set.seed(seed) | |
| shp <- c(sample(length(identicon.shapes), 2), | |
| sample(c(1, 4, 8, 25, 26, 30, 34) + 1, 1)) | |
| invert <- as.logical(rbinom(3, 1, 0.5)) | |
| col <- paste0('#', as.hexmode(sample(0xFFFFFF, 1))) | |
| png(f <- tempfile(fileext='.png'), height=128, width=128, type='cairo') | |
| par(mfrow=c(4, 4), mar=rep(0, 4)) | |
| identiblock(shp[1], col=col, invert=invert[1]) | |
| identiblock(shp[2], col=col, invert=invert[2]) | |
| identiblock(shp[2], rotate=90, col=col, invert=invert[2]) | |
| identiblock(shp[1], rotate=90, col=col, invert=invert[1]) | |
| identiblock(shp[2], col=col, invert=invert[2])#, flip='h', rotate=270) | |
| identiblock(shp[3], col=col, invert=invert[3]) | |
| identiblock(shp[3], col=col, invert=invert[3]) | |
| identiblock(shp[2], rotate=270, col=col, invert=invert[2]) | |
| identiblock(shp[2], rotate=270, col=col, invert=invert[2]) | |
| identiblock(shp[3], col=col, invert=invert[3]) | |
| identiblock(shp[3], col=col, invert=invert[3]) | |
| identiblock(shp[2], col=col, invert=invert[2])#, flip='h', rotate=270) | |
| identiblock(shp[1], rotate=270, col=col, invert=invert[1]) | |
| identiblock(shp[2], rotate=90, col=col, invert=invert[2]) | |
| identiblock(shp[2], col=col, invert=invert[2]) | |
| identiblock(shp[1], rotate=180, col=col, invert=invert[1]) | |
| dev.off() | |
| file.show(f) | |
| } | |
| identicon('[email protected]') | |
| # For safe-keeping (in case PHP source disappears): | |
| # > dput(identicon.shapes) | |
| # list(list(structure(c(90, 135, 225, 270, 0.5, 0.707106781186548, | |
| # 0.707106781186548, 0.5), .Dim = c(4L, 2L))), list(structure(c(45, | |
| # 135, 225, 315, 0.707106781186548, 0.707106781186548, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(4L, 2L))), list(structure(c(45, | |
| # 135, 225, 0.707106781186548, 0.707106781186548, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L))), list(structure(c(90, 225, 315, 0.5, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L))), list(structure(c(0, 90, | |
| # 180, 270, 0.5, 0.5, 0.5, 0.5), .Dim = c(4L, 2L))), list(structure(c(0, | |
| # 135, 270, 315, 0.5, 0.707106781186548, 0.5, 0.707106781186548 | |
| # ), .Dim = c(4L, 2L))), list(structure(c(0, 90, 180, 0.25, 0.5, | |
| # 0.25), .Dim = c(3L, 2L)), structure(c(0, 315, 270, 0.25, 0.707106781186548, | |
| # 0.5), .Dim = c(3L, 2L)), structure(c(270, 180, 225, 0.5, 0.25, | |
| # 0.707106781186548), .Dim = c(3L, 2L))), list(structure(c(0, 135, | |
| # 270, 0.5, 0.707106781186548, 0.5), .Dim = c(3L, 2L))), list(structure(c(45, | |
| # 135, 225, 315, 0.353553390593274, 0.353553390593274, 0.353553390593274, | |
| # 0.353553390593274), .Dim = c(4L, 2L))), list(structure(c(180, | |
| # 225, 0, 0.5, 0.707106781186548, 0), .Dim = c(3L, 2L)), structure(c(45, | |
| # 90, 0, 0.707106781186548, 0.5, 0), .Dim = c(3L, 2L))), list(structure(c(90, | |
| # 135, 180, 0, 0.5, 0.707106781186548, 0.5, 0), .Dim = c(4L, 2L | |
| # ))), list(structure(c(0, 180, 270, 0.5, 0.5, 0.5), .Dim = c(3L, | |
| # 2L))), list(structure(c(315, 225, 0, 0.707106781186548, 0.707106781186548, | |
| # 0), .Dim = c(3L, 2L))), list(structure(c(90, 180, 0, 0.5, 0.5, | |
| # 0), .Dim = c(3L, 2L))), list(structure(c(90, 135, 180, 0.5, 0.707106781186548, | |
| # 0.5), .Dim = c(3L, 2L))), list(structure(c(90, 135, 180, 0, 0.5, | |
| # 0.707106781186548, 0.5, 0), .Dim = c(4L, 2L)), structure(c(0, | |
| # 315, 270, 0, 0.5, 0.707106781186548, 0.5, 0), .Dim = c(4L, 2L | |
| # ))), list(structure(c(315, 225, 0, 0.707106781186548, 0.707106781186548, | |
| # 0), .Dim = c(3L, 2L)), structure(c(45, 135, 0, 0.707106781186548, | |
| # 0.707106781186548, 0), .Dim = c(3L, 2L))), list(structure(c(90, | |
| # 135, 225, 0.5, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L))), list(structure(c(90, 135, 225, 0.5, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L)), structure(c(45, 90, 270, | |
| # 0.707106781186548, 0.5, 0.5), .Dim = c(3L, 2L))), list(structure(c(90, | |
| # 135, 225, 0.5, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(45, 90, 0, 0.707106781186548, 0.5, 0), .Dim = c(3L, | |
| # 2L))), list(structure(c(135, 270, 315, 0.707106781186548, 0.5, | |
| # 0.707106781186548), .Dim = c(3L, 2L))), list(structure(c(180, | |
| # 225, 0, 0.5, 0.707106781186548, 0), .Dim = c(3L, 2L)), structure(c(45, | |
| # 90, 0, 0.707106781186548, 0.5, 0), .Dim = c(3L, 2L)), structure(c(0, | |
| # 0, 270, 0.5, 0, 0.5), .Dim = c(3L, 2L))), list(structure(c(0, | |
| # 315, 270, 0.25, 0.707106781186548, 0.5), .Dim = c(3L, 2L)), structure(c(270, | |
| # 180, 225, 0.5, 0.25, 0.707106781186548), .Dim = c(3L, 2L))), | |
| # list(structure(c(0, 45, 315, 0.25, 0.707106781186548, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L)), structure(c(180, 135, 225, 0.25, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L))), list(structure(c(0, | |
| # 45, 315, 0.25, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(180, 135, 225, 0.25, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L)), structure(c(180, 90, | |
| # 0, 270, 0.25, 0.5, 0.25, 0.5), .Dim = c(4L, 2L))), list(structure(c(0, | |
| # 90, 180, 270, 0.25, 0.25, 0.25, 0.25), .Dim = c(4L, 2L))), | |
| # list(structure(c(0, 45, 315, 0.25, 0.707106781186548, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L)), structure(c(180, 135, 225, 0.25, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L)), structure(c(270, 225, | |
| # 315, 0.25, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(90, 135, 45, 0.25, 0.707106781186548, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L))), list(structure(c(315, 225, 0, 0.707106781186548, | |
| # 0.707106781186548, 0), .Dim = c(3L, 2L)), structure(c(0, | |
| # 90, 180, 0.5, 0.5, 0.5), .Dim = c(3L, 2L))), list(structure(c(135, | |
| # 270, 315, 0.707106781186548, 0.5, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(225, 90, 45, 0.707106781186548, 0.5, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L))), list(structure(c(90, 135, 225, 0.5, | |
| # 0.707106781186548, 0.707106781186548), .Dim = c(3L, 2L)), | |
| # structure(c(315, 45, 270, 0.707106781186548, 0.707106781186548, | |
| # 0.5), .Dim = c(3L, 2L))), list(structure(c(0, 45, 315, | |
| # 0.25, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(180, 135, 225, 0.25, 0.707106781186548, | |
| # 0.707106781186548), .Dim = c(3L, 2L)), structure(c(270, 225, | |
| # 315, 0.25, 0.707106781186548, 0.707106781186548), .Dim = c(3L, | |
| # 2L)), structure(c(90, 135, 45, 0.25, 0.707106781186548, 0.707106781186548 | |
| # ), .Dim = c(3L, 2L)), structure(c(0, 90, 180, 270, 0.25, | |
| # 0.25, 0.25, 0.25), .Dim = c(4L, 2L))), list(structure(c(0, | |
| # 90, 180, 270, 270, 180, 90, 0, 0.5, 0.5, 0.5, 0.5, 0.25, | |
| # 0.25, 0.25, 0.25), .Dim = c(8L, 2L))), list(structure(c(0, | |
| # 90, 180, 270, 0.25, 0.5, 0.25, 0.5), .Dim = c(4L, 2L))), | |
| # list(structure(c(180, 225, 0, 0.5, 0.707106781186548, 0), .Dim = c(3L, | |
| # 2L)), structure(c(45, 90, 0, 0.707106781186548, 0.5, 0), .Dim = c(3L, | |
| # 2L)), structure(c(0, 0, 270, 0.5, 0, 0.5), .Dim = c(3L, 2L | |
| # )), structure(c(90, 135, 180, 0.5, 0.707106781186548, 0.5 | |
| # ), .Dim = c(3L, 2L))), list(structure(c(0, 90, 180, 270, | |
| # 0, 0, 270, 180, 90, 0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.25, 0.25, | |
| # 0.25, 0.25, 0.25), .Dim = c(10L, 2L))), list(structure(c(90, | |
| # 45, 0, 0.5, 0.707106781186548, 0.25), .Dim = c(3L, 2L)), | |
| # structure(c(0, 315, 270, 0.5, 0.707106781186548, 0.25 | |
| # ), .Dim = c(3L, 2L)), structure(c(270, 225, 180, 0.5, | |
| # 0.707106781186548, 0.25), .Dim = c(3L, 2L))), list(structure(c(90, | |
| # 45, 0, 0.5, 0.707106781186548, 0.25), .Dim = c(3L, 2L)), | |
| # structure(c(0, 315, 270, 0.5, 0.707106781186548, 0.25 | |
| # ), .Dim = c(3L, 2L))), list(structure(c(90, 45, 0, 0.5, | |
| # 0.707106781186548, 0.25), .Dim = c(3L, 2L)), structure(c(270, | |
| # 225, 180, 0.5, 0.707106781186548, 0.25), .Dim = c(3L, 2L))), | |
| # list(structure(c(90, 225, 0, 315, 0.5, 0.707106781186548, | |
| # 0, 0.707106781186548), .Dim = c(4L, 2L))), list(structure(c(90, | |
| # 225, 0, 315, 225, 225, 315, 0.5, 0.707106781186548, 0, 0.353553390593274, | |
| # 0.353553390593274, 0.707106781186548, 0.707106781186548), .Dim = c(7L, | |
| # 2L))), list(structure(c(90, 135, 180, 0.5, 0.707106781186548, | |
| # 0.5), .Dim = c(3L, 2L)), structure(c(270, 315, 0, 0.5, 0.707106781186548, | |
| # 0.5), .Dim = c(3L, 2L))), list(structure(c(90, 135, 180, | |
| # 180, 0.5, 0.707106781186548, 0.5, 0.25), .Dim = c(4L, 2L)), | |
| # structure(c(270, 315, 0, 0, 0.5, 0.707106781186548, 0.5, | |
| # 0.25), .Dim = c(4L, 2L))), list(structure(c(0, 45, 0, | |
| # 315, 0.5, 0.353553390593274, 0, 0.353553390593274), .Dim = c(4L, | |
| # 2L)), structure(c(180, 135, 0, 225, 0.5, 0.353553390593274, | |
| # 0, 0.353553390593274), .Dim = c(4L, 2L))), list(structure(c(0, | |
| # 45, 0, 315, 0.5, 0.707106781186548, 0, 0.353553390593274), .Dim = c(4L, | |
| # 2L)), structure(c(180, 135, 0, 225, 0.5, 0.353553390593274, | |
| # 0, 0.707106781186548), .Dim = c(4L, 2L)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment