У меня возникают проблемы с вычислением углов по часовой стрелке между непрерывными двумерными векторами. Мои расчетные углы не кажутся правильными, когда я сравниваю их на глазу на сюжете. Ниже мой процесс в R.Углы между непрерывными 2D-векторами
При необходимости, установить и включить «круговой» пакет:
install.packages('circular')
library(circular)
Сформировать небольшой кадр данных 2D координаты:
functest <- data.frame(x=c(2,8,4,9,10,7),y=c(6,8,2,5,1,4))
земля точки для справки:
windows(height=8,width=8)
par(pty="s")
plot(functest, main = "Circular Functions Test")
## draw arrows from point to point :
s <- seq(length(functest$x)-1) # one shorter than data
arrows(functest$x[s], functest$y[s], functest$x[s+1], functest$y[s+1], col = 1:3)
Создать функцию, которая вычисляет угол между двумя векторами:
angle <- function(m)
{ # m is a matrix
dot.prod <- crossprod(m[, 1], m[, 2])
norm.x <- norm(m[, 1], type="2")
norm.y <- norm(m[, 2], type="2")
theta <- acos(dot.prod/(norm.x * norm.y))
as.numeric(theta) # returns the angle in radians
}
Сформировать вектор углов компаса в градусах (вращение по часовой стрелке):
functest_matrix <- cbind(x = functest$x,y = functest$y)
moves <- apply(functest_matrix, 2, diff)
tst <- lapply(seq(nrow(moves) - 1), function(idx) moves[c(idx, idx + 1), ])
functest_angles <- vapply(tst, angle, numeric(1))
functest_object <- circular(functest_angles, type="angles", units="radians", zero=0, rotation = "counter")
functest_convert <- conversion.circular(functest_object, type = "angles", units = "degrees", rotation = "clock", zero = pi/2)
functest_compass <- lapply(functest_convert, function(x) {if (x < 0) x+360 else x}) # converts any negative rotations to positive
Я подозреваю, что что-то неправильно, может быть, протекающие в моих последних трех строк кода, когда я пытаюсь преобразовать «нормальный» против часовой стрелки углов в радианах до углов компаса по часовой стрелке в градусах. Любая помощь будет принята с благодарностью!
Кроме того, 'acos()' имеет проблемы (точность и численная неустойчивость), когда угол близок к 0 или 180 градусов, а 'atan2 (,)' численно устойчив под любым углом. – comingstorm