Implementing Circles example
[This article was first published on R snippets, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
This week I reimplemented part of Conic Sections 1 model from NetLogo. In the model turtles seek to to be in target distance from center.Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
My code takes only one center point, so only circles can be obtained. Apart from turtle location plot given in NetLogo implementation I added:
- plot showing maximal difference between turtle distance and target distance;
- decreasing turtle step size.
Below is the code generating the simulation:
# n: number of turtles
# p.x, p.y: location of center
# range: turtles have random position from [0,range]
# and will move in random angle a
# step: how fast turtles move
# target: target distance from center
# time: simulation time
init <- function(n, p.x, p.y, range, step, target, time) {
sim <- list(
turtles = data.frame(x = runif(n, max = range),
y = runif(n, max = range),
a = runif(n, max = 2 * pi)),
p.x = p.x, p.y = p.y, step = step, target = target,
time = time, max.dist = rep(NA, time))
# Calculate turtle distance from center
sim$turtles$dist <- sqrt((sim$turtles$x - p.x) ^ 2 +
(sim$turtles$y - p.y) ^ 2)
return(sim)
}
step <- function(sim) {
x <- sim$turtles$x
y <- sim$turtles$y
# Remember last distance and save current distance
o.dist <- sim$turtles$dist
n.dist <- sqrt((x - sim$p.x) ^ 2 + (y - sim$p.y) ^ 2)
sim$turtles$dist <- n.dist
# For turtles that are too far and are moving out
# or too close and are moving in randomly change direction
w.dist <- ((n.dist < o.dist) & (n.dist < sim$target)) |
((n.dist > o.dist) & (n.dist > sim$target))
sim$turtles$a[w.dist] <- runif(sum(w.dist), max = 2 * pi)
sim$turtles$x <- x + sin(sim$turtles$a) * sim$step
sim$turtles$y <- y + cos(sim$turtles$a) * sim$step
return(sim)
}
do.plot <- function(sim) {
rng <- quantile(c(sim$turtles$x, sim$turtles$y),
c(0.05, 0.95))
rng <- round(rng, -1) + c(-10, 10)
par(mai = rep(0.5, 4), mfrow = c(1, 2))
plot(sim$turtles$x, sim$turtles$y, pch = ".",
xlim = rng, ylim = rng, xlab = "", ylab = "",
main = "Turtle location")
points(sim$p.x, sim$p.y, col = "red", pch = 20, cex = 2)
plot(sim$max.dist, type = "l",
ylim = c(0, max(sim$max.dist, na.rm = TRUE) + 5),
xlab = "", ylab = "", main = "Max difference from target")
}
run <- function(sim) {
for (i in 1:sim$time) {
sim <- step(sim)
sim$step <- sim$step * 127 / 128
sim$max.dist[i] <- max(sim$turtles$dist) - sim$target
do.plot(sim)
}
}
sim <- init(4096, 128, 128, 256, 2, 128, 512)
set.seed(0)
run(sim)
To leave a comment for the author, please follow the link and comment on their blog: R snippets.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
