我给定(x,y)点并知道半径。我想求出圆上各点的角度。将来我想用这段代码来测试角是否均匀分布在[0,2Pi]这个区间上。
我试过的代码是
b <- matrix(c(d[,2],d[,5]),ncol=2)
S <- (b/sqrt((rowSums(b^2))))
#S <- matrix(S[!is.na(S)],ncol=2)
lim <- c(-1,1)
plot(S,xlim=lim,ylim=lim,xlab=expression(S1),ylab=expression(S2))
#S<-S[!is.na(S)]
U <- matrix(c(0),nrow=nrow(S),ncol=1)
for (i in 1:nrow(S)) {
U[i,1] <- (atan(abs(S[i,1]/S[i,2])))
}
那段代码给了我一些角度,但没有一个在[270,360]这个区间内。
嗨,如果你能给一些简单的数据样本,这将是非常有帮助的。
然而,我最初可以看到一些问题与使用的 atan()
.
atan
需要一个单一的参数,并返回一个弧度而非度数的角度,结果含糊不清,因为你不知道数值在哪个象限。atan
结果是含糊不清的,因为你不知道这些值在哪个象限。例如,没有办法区分一个负的 x
值是因为我们在第二或第四象限。要解决这个问题,你可以使用 atan2()
它需要两个参数,从而消除了歧义。见此. 对于intance。
只用 atan
你可以看到这个问题(我这里是换算成度数)
atan(1/1) * 180/pi # first quadrant
# 45
atan(1/-1) * 180/pi # second quadrant
# -45
atan(-1/-1) * 180/pi # third quadrant
# 45
atan(-1/1) * 180/pi # fourth quadrant
# -45
正如你所看到的,你只在以下方面得到结果 [-90,90]
( [-pi/2, pi/2]
).
但使用 atan2()
atan2(y = 1, x = 1) * 180/pi # first quadrant
# 45
atan2(y = 1, x = -1) * 180/pi # second quadrant
# 135
atan2(y = -1, x = -1) * 180/pi # third quadrant
# -135 same as 225 (360-135)
atan2(y = -1, x = 1) * 180/pi # fourth quadrant
# -45 same as 315 (360-45)
正如您所看到的,现在您可以使用以下方法消除您的值属于哪个象限的歧义 atan2
.