rm(list = ls())
library(deldir)
library(sp)
library(plyr)
side_length = 100
## Create random SET of XY coordinates (size = 100x100)
set.seed(11)
df = data.frame(matrix(sample(1:100,16,replace=TRUE),nrow=8))
## Convert df to SPatialPointsDataFrame
spdf <- SpatialPointsDataFrame(df,df)
## deldir() function creates tesselation (voronoi) plot
z <- deldir(df,plotit=TRUE,wl='te')
## tile.list() creates a list of data for tiles
zz <- tile.list(deldir(df,plotit=TRUE,wl='te'))
## Voronoi Polygons Function
voronoipolygons = function(layer) {
require(deldir)
crds = layer at coords
z = deldir(crds[,1], crds[,2])
w = tile.list(z)
polys = vector(mode='list', length=length(w))
require(sp)
for (i in seq(along=polys)) {
pcrds = cbind(w[[i]]$x, w[[i]]$y)
pcrds = rbind(pcrds, pcrds[1,])
polys[[i]] = Polygons(list(Polygon(pcrds)), ID=as.character(i))
}
SP = SpatialPolygons(polys)
voronoi = SpatialPolygonsDataFrame(SP, data=data.frame(x=crds[,1],
y=crds[,2], row.names=sapply(slot(SP, 'polygons'),
function(x) slot(x, 'ID'))))
}
## Generate SpatialPolygonsDataFrame to use as input for over() function
vpl <- voronoipolygons(spdf)
## Random Walk Function generates North, South East or West movement
## with transit from across screen (like PacMan, going out one side,
## coming back on the other side) to prevent getting stuck in corner
random_walk <- function(step_quantity, step_length, plot = FALSE){
require(ggplot2)
walker <- data.frame(matrix(c(0,0), nrow = step_quantity, ncol = 3,
byrow = T))
names(walker)[1]<-paste("x")
names(walker)[2]<-paste("y")
names(walker)[3]<-paste("which")
## Seed random initial starting point
walker[1,1:2] <- matrix(sample(1:100,2,replace=TRUE),nrow=1)
walker[1,3] <-
as.numeric(rownames(over(SpatialPoints(walker[1,1:2]),vpl,returnList=
TRUE)[[1]]))
where_to <- as.numeric()
for(i in 2:step_quantity){
where_to <- as.numeric()
where_to <- walker[i-1,1:2]
which_next <- sample(c("bb","dd","ff","hh"),1)
if (which_next == "bb") {
if (walker[i-1,2] == side_length) {where_to[1,2] <- 0
} else {where_to[1,2] <- walker[i-1,2]+step_length}
}
else if (which_next == "dd") {
if (walker[i-1,1] == 0 ) {where_to[1,1] <- side_length
} else {where_to[1,1] <- walker[i-1,1]-step_length}
}
else if (which_next == "ff") {
if (walker[i-1,1] == side_length) {where_to[1,1] <- 0
} else {where_to[1,1] <- walker[i-1,1]+step_length}
}
else {
if (walker[i-1,2] == 0) {where_to[1,2] <- side_length
} else {where_to[1,2] <- walker[i-1,2]-step_length}
}
walker[i,1:2] <- where_to
}
walker[i,3] <- as.numeric(rownames(over(SpatialPoints(walker[i,1:2]),
vpl,returnList= TRUE)[[1]]))
if(plot){
require(ggplot2)
p <- ggplot(walker, aes(x = x, y = y))
p <- p + geom_path()
print(p)
}
return(walker)
}
try(transits <- random_walk(5000,1),silent=F)