我正试图让我的随机游走在每一步调用函数z。每当步骤结束于背景图像变量CS = 1中的红色像素时。如果步骤以黑色像素结束,则CS = 0。现在它只是一个随机生成的值。不要担心其他的东西,我提供给你重现问题,但这些部分工作正常。关键部分是函数step.prob中的变量CS。
主要问题:如何让步行功能读取背景图像?< - solve
新问题:我在step.prob()函数中收到“下标越界”错误。为什么以及如何解决?
到目前为止,它看起来像这样:
您将需要包EBImage,并且此图像在工作目录中保存为testmap2.png以运行此代码。 该代码目前是:
library(tiff)
library("EBImage")
pic<-readImage("testmap2.png",all=TRUE,package="EBImage")
display(pic, method="raster")
dim(pic)
pic[,,1]
par(bg="black",col="black",col.axis="white",new=T)
P<-30
step.max=125
s<-step.max
pic<-readImage("testmap2.png",all=TRUE,package="EBImage")
walkW <- function(n.times=125,
xlim=c(524058,542800),
ylim=c(2799758,2818500),
start=c(542800,2815550),
stepsize=c(4000,4000)) {
display(pic, method="raster")
par(bg="black",col="black",col.axis="white",new=T)
plot(c(0,0),type="n",xlim=xlim,ylim=ylim,
xlab="Easting",ylab="Northing",col="white",col.lab="white")#arena
x <- start[1]
y <- start[2]
steps <- 1/c(1,2,4,8,12,16)
steps.y <- c(steps,-steps,0)
steps.x <- c(steps[c(1,5,6)],-steps,0)
points(x,y,pch=16,col="green",cex=1)
for (i in 1:n.times) {
repeat {
xi <- stepsize[1]*sample(steps.x,1)
yi <- stepsize[2]*sample(steps.y,1)
newx <- x+xi
newy <- y+yi
if (newx>xlim[1] && newx<xlim[2] &&
newy>ylim[1] && newy<ylim[2]) break
}
lines(c(x,newx),c(y,newy),col="white")
x <- newx
y <- newy
####the following function returns an "subscript out of bounds" error
step.prob<-function(n.times=step.max){
CS<-pic[x,y,1]
CS.max<-1
step.num<-15
SP<-(((CS/CS.max)*(1-(step.num/step.max))+(step.num/step.max))*100)
}
z<-step.prob(1)
##end the function that returns an error
if(z>P)break
else
if(step.max){points(newx,newy,pch=16,col="yellow",cex=1)
}
}
}
set.seed(101)
walkW(s)
答案 0 :(得分:1)
颜色png
或jpg
只是位置和RGB颜色的多维数组。
library(png) # same idea for EBImage
pic<-readPNG("testmap2.png")
dim(pic) # 615 683 3 (3 for the RGB levels)
pic[1:5,1:5,1] # where is it red?
返回:
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 1 1
[2,] 0 0 0 1 1
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
[5,] 0 0 0 0 0
所以要测试步行中的红点:
x <- 2; y <- 2
pic[x,y,1] # 0, not red
x <- 2; y <- 5
pic[x,y,1] # 1 , red