Dear Researchers,

I wish to improve the code of "Generating Random Transects of Same Length",
by  Marcellino De la Cruz to do a forest invetory analysis
I am trying to use with "Stratified Random Point" inside a grid.

the problem is: sometimes the transect line enter inside another square (if
You run the code you can see very easy the problem). Eventually with
vertices(tiles(Z)) I can change in w=
.....................

# Test if every circle point is inside polygonal boundary
srp.disc.df <- lapply(srp.disc, function(W){
                          inside.owin(W$bdry[[1]]$x,W$bdry[[1]]$y
,w=mywindow)})

.........................

library(spatstat)
mywindow <- owin(c(0,3000),c(0,2000))
plot(mywindow)
# Divide Region into Quadrats
Z <- quadrats(mywindow, 10, 10)
plot(Z, add=T)
# Stratified Random Point
srp <- rstrat(win=Z, nx=10,k=1)
plot(srp,pch=20,cex = 0.8, add=T,col="blue")

# transect
ltransect <- 100

srp.xy <- data.frame(srp$x,srp$y)

#compute a circle around each point
srp.disc <- apply(srp.xy,1, function(x) disc(r=ltransect, x))

# Plot all circle buffer
for(i in 1:length(srp.disc)) {
                    plot(srp.disc[[i]],add=T)
}


# the problem is here. I need to change in w=with the each part of Z(=Divide
Region into Quadrats),
# and compte for each points the following test

# Test if every circle point is inside polygonal boundary
srp.disc.df <- lapply(srp.disc, function(W){
                          inside.owin(W$bdry[[1]]$x,W$bdry[[1]]$y
,w=mywindow)})


# function to sample circle points within the window
samplea2 <- function(srp.xy, l1=srp.disc, l2=srp.disc.df){
                    result <-c(0,0)
                    for(i in 1:length(l1)){
                                      truinside<-sum(l2[[i]])
                                      inside
<-cbind(l1[[i]]$bdry[[1]]$x,l1[[i]]$bdry[[1]]$y)[l2[[i]],]
                                      result<-rbind(result,
inside[sample(1:truinside, size=1),])
                                }
                            result <- result[-1,]
                            result <- cbind(srp.xy,result)
                            return(result)
}

# the result is a matrix with x0,y0, x1, y1 for each transect
# Plot the random transects:
segmentos <- samplea2(srp.xy)
segments(segmentos[,1][s], segmentos[,2][s],segmentos[,3][s],
segmentos[,4][s])





this is the orginal code:

library(spatstat)

# Define polygon, length of transect and number of (points)transects
data(letterR)
mywindow <- letterR
ltransect <- 0.3
npoints <- 100
s <- 1:npoints

# Generate random origin points
cosa <- runifpoint(npoints, w=mywindow)
plot(cosa)


cosaxy <- data.frame(cosa$x,cosa$y)

#compute a circle around each point
cosadisc<- apply(cosaxy,1, function(x) disc(r=ltransect, x))

# Test if every circle point is inside polygonal boundary
cosadisc.df <- lapply(cosadisc, function(W){
                          inside.owin(W$bdry[[1]]$x,W$bdry[[1]]$y
,w=mywindow)})

#function to sample circle points within the window
samplea2 <- function(cosaxy, l1=cosadisc, l2=cosadisc.df){
                    result<-c(0,0)
                    for (i in 1:length(l1)){
                          truinside<-sum(l2[[i]])
                          inside
<-cbind(l1[[i]]$bdry[[1]]$x,l1[[i]]$bdry[[1]]$y)[l2[[i]],]
                          result<-rbind(result,  inside[sample(1:truinside,
size=1),])
                    }
                    result<-result[-1,]
                    result<-cbind(cosaxy,result)
                    return(result)
}

#the result is a matrix with x0,y0, x1, y1 for each transect
#Plot the random transects:

segmentos<-samplea2(cosaxy)
segments(segmentos[,1][s], segmentos[,2][s],segmentos[,3][s],
segmentos[,4][s])

	[[alternative HTML version deleted]]

