-
Nicolas Cattaneo authoredNicolas Cattaneo authored
02_Compute_angles_cone.r 4.20 KiB
rm(list=ls())
gc()
## system("gio mount -u smb://int.nibio.no/Databank")
## system(paste0("gio mount smb://int.nibio.no/Databank ",
## "< /home/nibio/.craden"))
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## Move the scan to have a local copy.
## Origin <- paste0("/run/user/1003/gvfs",
## "/smb-share:server=int.nibio.no,",
## "share=databank/Prosjekter",
## "/51160_IMPRINT/Forest_projections",
## "/DataR/to_map/merged_22_classified.las")
## Dest <- "/home/nibio/DATA"
## cmd <- paste("cp", Origin, Dest)
## system(cmd)
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## packages and functions
rm(list=ls())
library("rlas")
library("rgl")
library("stringr")
library("VoxR")
library("data.table")
## load("/home/nibio/REPOS/holger_tower_pov/DataR/pan3d.RData")
## load("/home/pepito/Documents/holger_tower_pov/DataR/pan3d.RData")
load("/home/pepito/Documents/holger_tower_pov/DataR/pan3d.RData")
## this function scale points coordinate
## between 0 and (max-min) values
Scale <- function(Vector){
((Vector - min(Vector))/
(max(Vector)-min(Vector)))*
(max(Vector)-min(Vector))}
## Distances
cross3d_prod <- function(v1,v2){
v3 <- vector()
v3[1] <- v1[2]*v2[3]-v1[3]*v2[2]
v3[2] <- v1[3]*v2[1]-v1[1]*v2[3]
v3[3] <- v1[1]*v2[2]-v1[2]*v2[1]
return(v3)
}
dist3d <- function(xa, ya, za, xb, yb, zb, xc, yc, zc) {
a <- c(xa, ya, za)
b <- c(xb, yb, zb, xc)
c <- c(xc, yc, zc)
v1 <- b - c
v2 <- a - b
v3 <- cross3d_prod(v1,v2)
area <- sqrt(sum(v3*v3))/2
d <- 2*area/sqrt(sum(v1*v1))
return(d)
}
dist3d2 <- function(xa, ya, za, xb, yb, zb) {
d <- sqrt(((xa - xb)^2) + ((ya - yb)^2) + ((za - zb)^2))
return(d)}
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## DataR
DataR <- paste0("/home/nibio/REPOS/holger_tower_pov/DataR")
## DataR <- paste0("/home/pepito/Documents/holger_tower_pov/DataR")
## plot data - full path
DataPaths <- list.files(DataR,
## pattern = "plot_",
## pattern = "Plot_",
## pattern = "merg",
## pattern = ".rds",
pattern = "Tower",
full.names = T)
Data <- read.las(DataPaths)
Data[, 1:3]
## Data <- fst::read_fst(DataPaths, as.data.table = T)
Data <- Data[sample(1:nrow(Data), nrow(Data)*0.10), ]
Data[, X := Scale(Data$X)]
Data[, Y := Scale(Data$Y)]
Data[, Z := Scale(Data$Z)]
Data[, X := X-mean(X)]
Data[, Y := Y-mean(Y)]
HGSTPoint <- Data[max(Z), ]
Data[, Dist := dist3d2(X, Y, 0,
HGSTPoint$X, HGSTPoint$Y, 0),
by = seq_len(nrow(Data))]
## open3d()
Data <- Data[Dist < 10,]
plot3d(Data, aspect = "iso", size = 3)
spheres3d(HGSTPoint, radius = 1, col = "yellow")
pan3d(3)
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## Create an artificial tower. Just the corners
## CornA <- data.table(X = 3, Y = 3, Z = 40)
## CornA <- Data[identify3d(Data, n = 1), ]
spheres3d(CornA, radius = 1, col = "yellow")
## Left click on a ground point in the point cloud
## Right click to scape
## CornB <- Data[identify3d(Data, n = 1), ]
spheres3d(CornB, radius = 1, col = "red")
## rgl.pop()
Data[, Dista := dist3d(X, Y, Z,
CornA$X, CornA$Y, CornA$Z,
CornB$X, CornB$Y, CornB$Z),
by = seq_len(nrow(Data))]
setnames(Data, "Dista", "CO")
## plot3d(Data, aspect = "iso", size = 0.5, col = "grey21")
## plot3d(Data[CO < 5 , ], aspect = "iso", size = 4, col = "red", add = T)
## spheres3d(CornA, radius = 1, col = "yellow")
## spheres3d(CornB, radius = 1, col = "red")
## pan3d(3)
Data[, H := dist3d2(X, Y, Z,
CornA$X, CornA$Y, CornA$Z),
by = seq_len(nrow(Data))]
Data[, Angle := CO/H]
Data[, Angle := (asin(Angle))*180/pi]
plot3d(Data[Angle > 28, ], aspect = "iso", size = 0.5, col = "grey21")
spheres3d(CornA, radius = 1, col = "yellow")
spheres3d(CornB, radius = 1, col = "red")
plot3d(Data[Angle < 28, ], aspect = "iso", size = 0.5, col = "red", add = T)
pan3d(3)
## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
## Select closest point by angle
Data2 <- Data[Angle < 15, ]
Data2[, min(H), by = Angle]