From 37ab0cb089057d8875897b8e7ca8d99dcec641b1 Mon Sep 17 00:00:00 2001 From: nicsoattc <nicolas.cattaneo@nibio.no> Date: Mon, 23 Oct 2023 14:04:42 +0200 Subject: [PATCH] update repo --- CodeR/04_Compute_angles_cone_clear.r | 34 ++-- CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r | 143 +++++++++++++++++ .../05_Compute_angles_cone_MAKEA_FUNCTION.r~ | 149 ++++++++++++++++++ MASTER.zip | Bin 0 -> 3598 bytes MASTER/00_apply_sifFootP.r | 68 ++++++++ MASTER/00_apply_sifFootP.r~ | 68 ++++++++ MASTER/FUNCTIONS/pan3d.r | 26 +++ MASTER/FUNCTIONS/sifFootP.r | 49 ++++++ MASTER/FUNCTIONS/sifFootP.r~ | 45 ++++++ 9 files changed, 566 insertions(+), 16 deletions(-) create mode 100644 CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r create mode 100644 CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r~ create mode 100644 MASTER.zip create mode 100644 MASTER/00_apply_sifFootP.r create mode 100644 MASTER/00_apply_sifFootP.r~ create mode 100644 MASTER/FUNCTIONS/pan3d.r create mode 100644 MASTER/FUNCTIONS/sifFootP.r create mode 100644 MASTER/FUNCTIONS/sifFootP.r~ diff --git a/CodeR/04_Compute_angles_cone_clear.r b/CodeR/04_Compute_angles_cone_clear.r index 38faa8e..7e7693d 100644 --- a/CodeR/04_Compute_angles_cone_clear.r +++ b/CodeR/04_Compute_angles_cone_clear.r @@ -21,8 +21,8 @@ library("data.table") ## DataR <- paste0("/home/nibio/REPOS/holger_tower_pov/DataR") ## CodeR <- paste0("/home/nibio/REPOS/holger_tower_pov/CodeR") -CodeR <- "/home/pepito/Documents/holger_tower_pov/CodeR/" -DataR <- "/home/pepito/Desktop/Temp_Holger_Data/" +CodeR <- "/home/nica/Documents/Holger_tower_pov/CodeR/" +DataR <- "/home/nica/Documents/Holger_tower_pov/DataR" ## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ## Functions @@ -39,7 +39,7 @@ DataPaths <- list.files(DataR, full.names = T) ## Data <- read.las(DataPaths[1]) -Data <- fst::read_fst(DataPaths[1], as.data.table = T) +Data <- fst::read_fst(DataPaths[2], as.data.table = T) Data <- Data[, 1:3] ## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -109,33 +109,35 @@ distances <- distance2line(Data, TopTowerSW, -40) ## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Data[distances$ids, CO := distances$distances] - ## 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[!is.na(CO), +## H := dist3d2(X, Y, Z, +## TopTowerSW$X, +## TopTowerSW$Y, +## TopTowerSW$Z), +## by = seq_len(nrow(Data))] + Data[!is.na(CO), - H := dist3d2(X, Y, Z, - TopTowerSW$X, - TopTowerSW$Y, - TopTowerSW$Z), - by = seq_len(nrow(Data))] + H := sqrt((X - TopTowerSW$X)^2 + + (Y - TopTowerSW$Y)^2 + + (Z - TopTowerSW$Z)^2)] Data[, Angle := CO/H] Data[, Angle := (asin(Angle))*180/pi] OpeningAngl <- 20 -plot3d(Data[Angle < OpeningAngl, ], - aspect = "iso", size = 1.5, col = "red") -spheres3d(TopTowerSW, radius = 1, col = "yellow") - -plot3d(Data[Angle > OpeningAngl, ], aspect = "iso", +plot3d(Data, aspect = "iso", size = 0.5, col = "grey21") - -spheres3d(TopTowerSW, radius = 1, col = "red") +spheres3d(TopTowerSW, radius = 1, col = "yellow") +plot3d(Data[Angle < OpeningAngl, ], + aspect = "iso", size = 1.5, col = "red", + add = T) plot3d(Data[Angle < OpeningAngl, ], aspect = "iso", size = 0.5, col = "red", add = T) pan3d(3) diff --git a/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r b/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r new file mode 100644 index 0000000..9a8e198 --- /dev/null +++ b/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r @@ -0,0 +1,143 @@ +rm(list=ls()) +gc() + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## packages functions +rm(list=ls()) + +library("rlas") +library("rgl") +library("stringr") +library("VoxR") +library("data.table") + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +CodeR <- "/home/nica/Documents/Holger_tower_pov/CodeR/" +DataR <- "/home/nica/Documents/Holger_tower_pov/DataR" + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## pan3d function +pan3d <- function(button) { + library("rgl") + start <- list() + begin <- function(x, y) { + start$userMatrix <<- par3d("userMatrix") + start$viewport <<- par3d("viewport") + start$scale <<- par3d("scale") + start$projection <<- rgl.projection() + start$pos <<- rgl.window2user( x/start$viewport[3], + 1 - y/start$viewport[4], 0.5, + projection = start$projection) + } + + update <- function(x, y) { + xlat <- (rgl.window2user( x/start$viewport[3], + 1 - y/start$viewport[4], 0.5, + projection = start$projection) - + start$pos)*start$scale + + mouseMatrix <- translationMatrix(xlat[1], xlat[2], xlat[3]) + par3d(userMatrix = start$userMatrix %*% t(mouseMatrix) ) + } + + rgl.setMouseCallbacks(button, begin, update) + cat("Callbacks set on button", button, "of rgl device", rgl.cur(), "\n") +} + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## plot data - full path +DataPaths <- list.files(DataR, + pattern = "22_classified.rds", + ## pattern = "22_classified.las", + full.names = T) + +Data <- fst::read_fst(DataPaths, as.data.table = T) +## Data <- read.las(DataPaths) +Data <- Data[, 1:3] + +## Use a sample to speed up computations +Data <- Data[sample(1:nrow(Data), nrow(Data)*0.10), ] +gc() + +## Very high values of X and Y generate problems when rendering +## the 3d graphics. Center the point cloud +Scale <- function(Vector){ + ((Vector - min(Vector))/ + (max(Vector)-min(Vector)))* + (max(Vector)-min(Vector))} + +Data[, X := Scale(Data$X)] +Data[, Y := Scale(Data$Y)] + + +## A point at the top of the tower, SW edge +TopTowerSW <- data.table(X = 173.4451, + Y = 104.955, + Z = 322.6828) +TopTowerSE <- data.table(X = 175.3196, + Y = 105.2212, + Z = 322.7785) + +## plot3d(Data, aspect = "iso", +## size = 3, col = "grey21") +## spheres3d(TopTowerSE, radius = 0.3, col = "yellow") +## spheres3d(TopTowerSW, radius = 0.3, col = "red") +## pan3d(3) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# Function to compute the distance between points and the line + +sifFootP <- function(PointCloud, TopTowerP, thetaDeg){ + + theta_rad <- thetaDeg * pi / 180 + d <- c(0, -1, tan(theta_rad)) + + cloud_south_indices <- which(PointCloud$Y < TopTowerP$Y) + cloud_south <- PointCloud[cloud_south_indices, ] + + cloud_matrix <- as.matrix(cloud_south) + TopTowerP_matrix <- matrix(rep(as.matrix(TopTowerP), + nrow(cloud_south)), + ncol=3, byrow=TRUE) + + r <- cloud_matrix - TopTowerP_matrix + + cross_product <- cbind(r[,2]*d[3] - r[,3]*d[2], + r[,3]*d[1] - r[,1]*d[3], + r[,1]*d[2] - r[,2]*d[1]) + + distances <- sqrt(rowSums(cross_product^2)) / sqrt(sum(d^2)) + distances <- data.table(distances = distances, + ids = cloud_south_indices) + + + PointCloud[distances$ids, CO := distances$distances] + + PointCloud[!is.na(CO), + H := sqrt((X - TopTowerP$X)^2 + + (Y - TopTowerP$Y)^2 + + (Z - TopTowerP$Z)^2)] + + PointCloud[, Angle := CO/H] + PointCloud[, Angle := (asin(Angle))*180/pi] + + SIFOpeningAngl <- 20 + + plot3d(Data, aspect = "iso", + size = 0.5, col = "grey21") + + spheres3d(TopTowerP, radius = 0.5, col = "green") + plot3d(PointCloud[Angle < SIFOpeningAngl, ], + aspect = "iso", size = 1.5, col = "red", + add = T) + +} + +sifFootP(PointCloud = Data, + TopTowerP = TopTowerSW, + thetaDeg = -30) + + + + diff --git a/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r~ b/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r~ new file mode 100644 index 0000000..7e7693d --- /dev/null +++ b/CodeR/05_Compute_angles_cone_MAKEA_FUNCTION.r~ @@ -0,0 +1,149 @@ +rm(list=ls()) +gc() + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## packages functions +rm(list=ls()) + +library("rlas") +library("rgl") +library("stringr") +library("VoxR") +library("data.table") + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## DataR and CodeR +## DataR <- paste0("/home/nibio/REPOS/holger_tower_pov/DataR") +## DataR <- paste0("/home/pepito/Documents/holger_tower_pov/DataR") +## DataR <- paste0("/home/nica/Documents/Holger_tower_pov/DataR") +## CodeR <- paste0("/home/nica/Documents/Holger_tower_pov/CodeR") + +## DataR <- paste0("/home/nibio/REPOS/holger_tower_pov/DataR") +## CodeR <- paste0("/home/nibio/REPOS/holger_tower_pov/CodeR") + +CodeR <- "/home/nica/Documents/Holger_tower_pov/CodeR/" +DataR <- "/home/nica/Documents/Holger_tower_pov/DataR" + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## Functions +source(paste0(CodeR, "/Functions/Functions.r")) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## 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[1]) +Data <- fst::read_fst(DataPaths[2], as.data.table = T) +Data <- Data[, 1:3] + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +Data <- Data[sample(1:nrow(Data), nrow(Data)*0.10), ] +gc() + +Data[, X := Scale(Data$X)] +Data[, Y := Scale(Data$Y)] + +## plot3d(Data, aspect = "iso", size = 0.2) +## plot3d(Data, aspect = "iso", size = 3) +## pan3d(3) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## Devise location is not in the area mentioned in the email. +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## A point at the topo ofthe tower, SW edge +TopTowerSW <- data.table(X = 173.4451, + Y = 104.955, + Z = 322.6828) +TopTowerSE <- data.table(X = 175.3196, + Y = 105.2212, + Z = 322.7785) + +## spheres3d(TopTowerSE, radius = 0.3, col = "yellow") +## spheres3d(TopTowerSW, radius = 0.3, col = "red") + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# Function to compute the distance between points and the line +distance2line <- function(cloud, TopTowerP, theta_deg) { + + theta_rad <- theta_deg * pi / 180 + + d <- c(0, -1, tan(theta_rad)) + + cloud_south_indices <- which(cloud$Y < TopTowerP$Y) + cloud_south <- cloud[cloud_south_indices, ] + + cloud_matrix <- as.matrix(cloud_south) + TopTowerP_matrix <- matrix(rep(as.matrix(TopTowerP), + nrow(cloud_south)), + ncol=3, byrow=TRUE) + + r <- cloud_matrix - TopTowerP_matrix + + cross_product <- cbind(r[,2]*d[3] - r[,3]*d[2], + r[,3]*d[1] - r[,1]*d[3], + r[,1]*d[2] - r[,2]*d[1]) + + distances <- sqrt(rowSums(cross_product^2)) / sqrt(sum(d^2)) + Result <- data.table(distances = distances, + ids = cloud_south_indices) + gc() + return(Result) +} + +# Example usage: Compute the distance with a vertical angle of 45 degrees +distances <- distance2line(Data, TopTowerSW, -40) + +## plot3d(Data, aspect = "iso", size = 0.2) +## spheres3d(TopTowerSW, radius = 1, col = "red") + +## plot3d(Data[distances[distances < 40, ]$ids, ], size = 10, col = "red", add = T) +## pan3d(3) + + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +Data[distances$ids, CO := distances$distances] + +## 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[!is.na(CO), +## H := dist3d2(X, Y, Z, +## TopTowerSW$X, +## TopTowerSW$Y, +## TopTowerSW$Z), +## by = seq_len(nrow(Data))] + +Data[!is.na(CO), + H := sqrt((X - TopTowerSW$X)^2 + + (Y - TopTowerSW$Y)^2 + + (Z - TopTowerSW$Z)^2)] + +Data[, Angle := CO/H] +Data[, Angle := (asin(Angle))*180/pi] + +OpeningAngl <- 20 + +plot3d(Data, aspect = "iso", + size = 0.5, col = "grey21") +spheres3d(TopTowerSW, radius = 1, col = "yellow") +plot3d(Data[Angle < OpeningAngl, ], + aspect = "iso", size = 1.5, col = "red", + add = T) + +plot3d(Data[Angle < OpeningAngl, ], aspect = "iso", size = 0.5, col = "red", add = T) +pan3d(3) +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + + + + diff --git a/MASTER.zip b/MASTER.zip new file mode 100644 index 0000000000000000000000000000000000000000..1df67f9d9b55b35afaa4cad081955d0e5211bfc4 GIT binary patch literal 3598 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 literal 0 HcmV?d00001 diff --git a/MASTER/00_apply_sifFootP.r b/MASTER/00_apply_sifFootP.r new file mode 100644 index 0000000..7998f21 --- /dev/null +++ b/MASTER/00_apply_sifFootP.r @@ -0,0 +1,68 @@ +rm(list=ls()) +gc() + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## packages functions +rm(list=ls()) + +library("rlas") +library("rgl") +library("stringr") +library("VoxR") +library("data.table") + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +MyCodeR <- "/home/nica/Documents/Holger_tower_pov/MASTER/FUNCTIONS" +MyDataR <- "/home/nica/Documents/Holger_tower_pov/DataR" + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## load functions +source(paste0(MyCodeR, "/pan3d.r")) +source(paste0(MyCodeR, "/sifFootP.r")) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## plot data - full path +DataPaths <- list.files(MyDataR, + pattern = "22_classified.rds", + ## pattern = "22_classified.las", + full.names = T) + +Data <- fst::read_fst(DataPaths, as.data.table = T) +## Data <- read.las(DataPaths) +Data <- Data[, 1:3] + +## Use a sample to speed up computations +Data <- Data[sample(1:nrow(Data), nrow(Data)*0.10), ] +gc() + +## Very high values of X and Y generate problems when rendering +## the 3d graphics. Center the point cloud +Scale <- function(Vector){ + ((Vector - min(Vector))/ + (max(Vector)-min(Vector)))* + (max(Vector)-min(Vector))} + +Data[, X := Scale(Data$X)] +Data[, Y := Scale(Data$Y)] + + +## A point at the top of the tower, SW edge +TopTowerSW <- data.table(X = 173.4451, + Y = 104.955, + Z = 322.6828) +TopTowerSE <- data.table(X = 175.3196, + Y = 105.2212, + Z = 322.7785) + +## plot3d(Data, aspect = "iso", +## size = 3, col = "grey21") +## spheres3d(TopTowerSE, radius = 0.3, col = "yellow") +## spheres3d(TopTowerSW, radius = 0.3, col = "red") +## pan3d(3) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## Compute POV +sifFootP(PointCloud = Data, + TopTowerP = TopTowerSE, + thetaDeg = -45) +pan3d(3) diff --git a/MASTER/00_apply_sifFootP.r~ b/MASTER/00_apply_sifFootP.r~ new file mode 100644 index 0000000..21f49dc --- /dev/null +++ b/MASTER/00_apply_sifFootP.r~ @@ -0,0 +1,68 @@ +rm(list=ls()) +gc() + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## packages functions +rm(list=ls()) + +library("rlas") +library("rgl") +library("stringr") +library("VoxR") +library("data.table") + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +MyCodeR <- "/home/nica/Documents/Holger_tower_pov/MASTER/FUNCTIONS" +MyDataR <- "/home/nica/Documents/Holger_tower_pov/DataR" + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## load functions +source(paste0(MyCodeR, "/pan3d.r")) +source(paste0(MyCodeR, "/sifFootP.r")) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## plot data - full path +DataPaths <- list.files(MyDataR, + pattern = "22_classified.rds", + ## pattern = "22_classified.las", + full.names = T) + +Data <- fst::read_fst(DataPaths, as.data.table = T) +## Data <- read.las(DataPaths) +Data <- Data[, 1:3] + +## Use a sample to speed up computations +Data <- Data[sample(1:nrow(Data), nrow(Data)*0.10), ] +gc() + +## Very high values of X and Y generate problems when rendering +## the 3d graphics. Center the point cloud +Scale <- function(Vector){ + ((Vector - min(Vector))/ + (max(Vector)-min(Vector)))* + (max(Vector)-min(Vector))} + +Data[, X := Scale(Data$X)] +Data[, Y := Scale(Data$Y)] + + +## A point at the top of the tower, SW edge +TopTowerSW <- data.table(X = 173.4451, + Y = 104.955, + Z = 322.6828) +TopTowerSE <- data.table(X = 175.3196, + Y = 105.2212, + Z = 322.7785) + +## plot3d(Data, aspect = "iso", +## size = 3, col = "grey21") +## spheres3d(TopTowerSE, radius = 0.3, col = "yellow") +## spheres3d(TopTowerSW, radius = 0.3, col = "red") +## pan3d(3) + +## @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +## Compute POV +sifFootP(PointCloud = Data, + TopTowerP = TopTowerSE, + thetaDeg = -20) +pan3d(3) diff --git a/MASTER/FUNCTIONS/pan3d.r b/MASTER/FUNCTIONS/pan3d.r new file mode 100644 index 0000000..03e46ca --- /dev/null +++ b/MASTER/FUNCTIONS/pan3d.r @@ -0,0 +1,26 @@ +pan3d <- function(button) { + library("rgl") + start <- list() + begin <- function(x, y) { + start$userMatrix <<- par3d("userMatrix") + start$viewport <<- par3d("viewport") + start$scale <<- par3d("scale") + start$projection <<- rgl.projection() + start$pos <<- rgl.window2user( x/start$viewport[3], + 1 - y/start$viewport[4], 0.5, + projection = start$projection) + } + + update <- function(x, y) { + xlat <- (rgl.window2user( x/start$viewport[3], + 1 - y/start$viewport[4], 0.5, + projection = start$projection) - + start$pos)*start$scale + + mouseMatrix <- translationMatrix(xlat[1], xlat[2], xlat[3]) + par3d(userMatrix = start$userMatrix %*% t(mouseMatrix) ) + } + + rgl.setMouseCallbacks(button, begin, update) + cat("Callbacks set on button", button, "of rgl device", rgl.cur(), "\n") +} diff --git a/MASTER/FUNCTIONS/sifFootP.r b/MASTER/FUNCTIONS/sifFootP.r new file mode 100644 index 0000000..42fcc47 --- /dev/null +++ b/MASTER/FUNCTIONS/sifFootP.r @@ -0,0 +1,49 @@ +sifFootP <- function(PointCloud, TopTowerP, thetaDeg){ + + theta_rad <- thetaDeg * pi / 180 + d <- c(0, -1, tan(theta_rad)) + + cloud_south_indices <- which(PointCloud$Y < TopTowerP$Y) + cloud_south <- PointCloud[cloud_south_indices, ] + + cloud_matrix <- as.matrix(cloud_south) + TopTowerP_matrix <- matrix(rep(as.matrix(TopTowerP), + nrow(cloud_south)), + ncol=3, byrow=TRUE) + + r <- cloud_matrix - TopTowerP_matrix + + cross_product <- cbind(r[,2]*d[3] - r[,3]*d[2], + r[,3]*d[1] - r[,1]*d[3], + r[,1]*d[2] - r[,2]*d[1]) + + distances <- sqrt(rowSums(cross_product^2)) / sqrt(sum(d^2)) + distances <- data.table(distances = distances, + ids = cloud_south_indices) + + + PointCloud[distances$ids, CO := distances$distances] + + PointCloud[!is.na(CO), + H := sqrt((X - TopTowerP$X)^2 + + (Y - TopTowerP$Y)^2 + + (Z - TopTowerP$Z)^2)] + + PointCloud[, Angle := CO/H] + PointCloud[, Angle := (asin(Angle))*180/pi] + + SIFOpeningAngl <- 23 + + plot3d(Data, aspect = "iso", + size = 0.5, col = "grey21") + + spheres3d(TopTowerP, radius = 0.5, col = "green") + plot3d(PointCloud[Angle < SIFOpeningAngl, ], + aspect = "iso", size = 1.5, col = "red", + add = T) + + ## RedPOints <- PointCloud[Angle < SIFOpeningAngl, ] + ## return(RedPOints) + + +} diff --git a/MASTER/FUNCTIONS/sifFootP.r~ b/MASTER/FUNCTIONS/sifFootP.r~ new file mode 100644 index 0000000..2473905 --- /dev/null +++ b/MASTER/FUNCTIONS/sifFootP.r~ @@ -0,0 +1,45 @@ +sifFootP <- function(PointCloud, TopTowerP, thetaDeg){ + + theta_rad <- thetaDeg * pi / 180 + d <- c(0, -1, tan(theta_rad)) + + cloud_south_indices <- which(PointCloud$Y < TopTowerP$Y) + cloud_south <- PointCloud[cloud_south_indices, ] + + cloud_matrix <- as.matrix(cloud_south) + TopTowerP_matrix <- matrix(rep(as.matrix(TopTowerP), + nrow(cloud_south)), + ncol=3, byrow=TRUE) + + r <- cloud_matrix - TopTowerP_matrix + + cross_product <- cbind(r[,2]*d[3] - r[,3]*d[2], + r[,3]*d[1] - r[,1]*d[3], + r[,1]*d[2] - r[,2]*d[1]) + + distances <- sqrt(rowSums(cross_product^2)) / sqrt(sum(d^2)) + distances <- data.table(distances = distances, + ids = cloud_south_indices) + + + PointCloud[distances$ids, CO := distances$distances] + + PointCloud[!is.na(CO), + H := sqrt((X - TopTowerP$X)^2 + + (Y - TopTowerP$Y)^2 + + (Z - TopTowerP$Z)^2)] + + PointCloud[, Angle := CO/H] + PointCloud[, Angle := (asin(Angle))*180/pi] + + SIFOpeningAngl <- 23 + + plot3d(Data, aspect = "iso", + size = 0.5, col = "grey21") + + spheres3d(TopTowerP, radius = 0.5, col = "green") + plot3d(PointCloud[Angle < SIFOpeningAngl, ], + aspect = "iso", size = 1.5, col = "red", + add = T) + +} -- GitLab