当我尝试在程序中获取向量的方向时,我的if语句不起作用。
问题是当我输入< -1,1>
的向量时我得到45°而不是125°
源代码
function addNum2() {
var newValue = Number(ordernow.firstvalue2.value);
newValue +=1;
ordernow.firstvalue2.value = newValue;
}
有谁知道什么是错的?
答案 0 :(得分:0)
对于v1
和v2
中至少有一个为负数的情况,您的逻辑不正确。 atan
method Javadocs表示:
返回的角度在-pi / 2到pi / 2
的范围内
因此,如果某个值v1
为0
或肯定且v2
为负,那么您最终会使用-45
,并且您应该添加360
度所以(1,-1)的输入是325度。
如果某个值v1
为负且v2
为正数,那么您将获得与上述情况相同的值,但您需要相反的方向。在这里加180度。
如果v1
和v2
都是否定的,那么您获得的度数值为45
,因此在此处添加180
是正确的。
这是更新的逻辑:
if (v1 >= 0) {
if (v2 < 0) {
dir += 360;
}
} else {
dir += 180;
}
对于(-1,1),这将为您提供135
度的正确值,而不是125
。
然而,在-pi到+ pi的整个范围内获得度数范围(或原始弧度)是Math.atan2
的工作。它需要极坐标,即v1
和v2
。
...计算y / x在-pi到pi范围内的反正切。
dir = Math.toDegrees(Math.atan2(v2, v1));
转换为学位后,如果360
为否定,您仍需要添加dir
度。逻辑更简单:
if (dir < 0) {
dir += 360;
}
答案 1 :(得分:0)
来自文档,atan(double a)
返回值的反正切;返回的角度在-pi / 2到pi / 2的范围内。
来自文档,atan2(double a)
返回从直角坐标(x,y)到极坐标(r,theta)的转换角度θ。此方法通过计算-pi到pi范围内y / x的反正切来计算相位θ。
atan
的使用正在将您的答案缩减pi
,以使其进入函数返回的值的范围内。切换到atan2
将解决这个问题,因为笛卡尔坐标转换为极坐标。显然,您可以使用toDegrees
函数。
答案 2 :(得分:0)
Math.toDegrees( Math.atan(v2/v1)
返回-45,然后你加90,所以它会给45。
对于你的if条款,这应该有效:
Math.toDegrees(Math.atan(Math.abs(v2/v1))