Line of Sight (LoS) Analysis: Multiple Observers (Part 3)
In this part of my LoS Analysis series, I will try to extend 3D LoS analysis for multiple observers. Assume that you drop multiple observers into a terrain with the aim of covering it perfectly (100% green).
We will reuse R codes used in Part 2. However we need to add a simple code piece to be used to merge Line of Sight results of multiple observers. If a point on terrain is visible by any of the observers that means point is visible, if the point is visible but far from all observers that means point is out of LoS due to distance (marked with yellow), for all other conditions point on terrain is red. updatestatus function is implemented for this purpose.
library(rgl)
##################
# Functions
##################
# 3D Terrain Function
height <- function (point) {
sin(point$x)+0.125*point$y*sin(2*point$x)+sin(point$y)+0.125*point$x*sin(2*point$y)+3
}
# Linear Function
linear <- function (px, observer, target) {
v <- observer - target
y <- ((px - observer[1])/v[1])*v[2]+observer[2]
z <- ((px - observer[1])/v[1])*v[3]+observer[3]
data.frame(x=px,y=y, z=z)
}
# Linear Function
distance <- function (terrain, observer) {
sqrt((terrain$x-observer[1])^2+(terrain$y-observer[2])^2+(terrain$height-observer[3])^2)
}
LoS <- function(terrain, observer, maxVisibleDistance){
status = c()
for (i in seq(1:nrow(terrain))) {
if (observer[1] == terrain$x[i] && observer[2] == terrain$y[i]){
if(observer[3] >= terrain$height[i]){
if (terrain$dist2observer[i] > maxVisibleDistance){
status <- c(status,"yellow")
}else{
status <- c(status,"green")
}
}else{
status <- c(status,"red")
}
}else{
# All points on line
line <- linear(seq(from=min(observer[1],terrain$x[i]),
to=max(observer[1],terrain$x[i]),
by=0.1),
observer,
c(terrain$x[i],terrain$y[i],terrain$height[i]))
# Terrain Height
h <- height(line)
# LoS Analysis
aboveTerrain <- round((line$z-h),2) >= 0.00
visible <- !is.element(FALSE,aboveTerrain)
if (visible){
# Second Rule
if(terrain$dist2observer[i] <= maxVisibleDistance){
status <- c(status,"green")
}else{
status <- c(status,"yellow")
}
}else{
status <- c(status,"red")
}
}
}
status
}
updatestatus <- function(status1,status2){
mergedstatus<-c()
for(i in seq(length(status1))){
if (status1[i] == "green" || status2[i] == "green"){
mergedstatus <- c(mergedstatus,"green")
}else if (status1[i] == "yellow" || status2[i] == "yellow"){
mergedstatus <- c(mergedstatus,"yellow")
}
else{
mergedstatus <- c(mergedstatus,"red")
}
}
mergedstatus
}
##################
# Input
##################
# Observer location
#observers<-c(0,0, 6,1,1,6)
# Max visible distance
maxVisibleDistance = 8
# Generate points with a step size of 0.1
x <- seq(from=-8,to=8,by=0.4)
xygrid <- expand.grid(x=x,
y=x)
terrain <- data.frame(xygrid,
height=height(xygrid)
)
# List of observers (x1,y1,z1,x2,y2,z2)
observers <- c(runif(2,-8,8),6,runif(2,-8,8),6,
runif(2,-8,8),6,runif(2,-8,8),6,
runif(2,-8,8),6,runif(2,-8,8),6,
runif(2,-8,8),6,runif(2,-8,8),6)
m <- matrix(data=observers,ncol=3,byrow=TRUE)
# Compute merged status of all observers
mergedstatus <- rep("red",length(terrain$height))
for(oidx in seq(1:dim(m)[1])){
terrain$dist2observer <- distance(terrain, m[oidx,])
status <- LoS(terrain,m[oidx,],maxVisibleDistance)
mergedstatus <- updatestatus(mergedstatus,status)
}
# Set merged status as the ultimate status
terrain <- data.frame(terrain,status = mergedstatus)
rgl.open()
rgl.surface(x, x,
matrix(data=terrain$height,nrow=length(x),ncol=length(x)),
col=matrix(data=mergedstatus,nrow=length(x),ncol=length(x))
)
bg3d("gray")
# Mark all observers
for(oidx in seq(1:dim(m)[1])){
spheres3d(c(m[oidx,1]),
c(m[oidx,3]),
c(m[oidx,2]),
radius=0.25,
color="white"
)
}
rgl.viewpoint(-60,30)
A Few Examples
Here are a few examples. All those observers are uniformly distributed over terrain using runif function
Trivial Case: Single Observer
Two Observers
Four Observers
Eight Observers
Posted on September 16, 2011, in Uncategorized and tagged R, Spatial. Bookmark the permalink. 1 Comment.






Pingback: Line of Sight (LoS) Analysis: Optimizing the Observers for Best Coverage (Part 4) « The great grandson of Husnu Sensoy