如果声明不做我想要的

时间:2016-04-08 22:39:47

标签: java

当我尝试在程序中获取向量的方向时,我的if语句不起作用。

问题是当我输入< -1,1>

的向量时

我得到45°而不是125°

源代码

function addNum2() {
    var newValue = Number(ordernow.firstvalue2.value);
    newValue +=1;
    ordernow.firstvalue2.value = newValue; 
}

有谁知道什么是错的?

3 个答案:

答案 0 :(得分:0)

对于v1v2中至少有一个为负数的情况,您的逻辑不正确。 atan method Javadocs表示:

  

返回的角度在-pi / 2到pi / 2

的范围内

因此,如果某个值v10或肯定且v2为负,那么您最终会使用-45,并且您应该添加360度所以(1,-1)的输入是325度。

如果某个值v1为负且v2为正数,那么您将获得与上述情况相同的值,但您需要相反的方向。在这里加180度。

如果v1v2都是否定的,那么您获得的度数值为45,因此在此处添加180是正确的。

这是更新的逻辑:

if (v1 >= 0) {
    if (v2 < 0) {
        dir += 360;
    }
} else {
    dir += 180;
}

对于(-1,1),这将为您提供135度的正确值,而不是125

然而,在-pi到+ pi的整个范围内获得度数范围(或原始弧度)是Math.atan2的工作。它需要极坐标,即v1v2

  

...计算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))