为什么atan2给了我不同的asin值?

时间:2013-08-28 01:49:41

标签: sin atan2

我试图计算一个直角三角形的值。两侧是相反的,斜边也恰好与角度相邻。用Java编写的一个代码使用atan2来获取角度。当我在C中使用atan2时,我得到了不同的值。我获得正确值的唯一方法是使用asin。

以下是C:

中的代码段
for(i = 0; i < n; i++)
{
    m = sqrt( (x - l[i].x) * (x - l[i].x) + (y * y) );

    dist = abs(x - l[i].x);

    ang = asin(dist/m) * 180.0 / 3.14159265;

    if(ang <= (l[i].a + .01))
        total += (double) l[i].I/(m*m);
}

以下是Java中的代码片段:

for (j = 0; j < n; j++)
     {
        d = Math.sqrt( (xs - lights[j]) * (xs - lights[j]) + (ys * ys) );

        w = Math.abs(xs - lights[j]);

        ang = Math.atan2(w, ys) * 180.0 / 3.14159265;

        if (ang <= angles[j] + 0.01)
        {
           total += (double ) intensities[j] / (d * d);
        }
     }

有人能解释一下这个问题吗?

2 个答案:

答案 0 :(得分:0)

反向/斜边=正弦,因此应该使用asin来获得角度。

答案 1 :(得分:0)

(见下面的设置条件)

OP问道:“在Java中使用atan2给我的角度和使用asin在C.为什么?”。 这只是罪(ang)=反向/斜边= dist / m和tan(ang)=反向/相邻= w / ys。

OP问道:“在C中使用atan2给我的角度与在Java中使用atan2的角度不同。为什么?”
这非常棘手,因为OP 没有发布违规代码。 OP没有说明这些不同的值是什么或提供测试数据。我们留下了有根据的猜测。

第一个预感是OP没有以正确的顺序使用C atan2()参数。 C和Java以相同的顺序使用atan2()(y,x)。 Excel使用(x,y)顺序。鉴于OP正在为y参数使用名为x的变量,这是合理的。

第二个想法是OP没有使用C中应该是atan2(dist, y)的相同边。

第三个想法有一个标志(不是正弦)问题。需要测试数据。


代码还有其他微妙的问题,比如为什么使用3.14159265代替M_PI?如果dist / m刚好超过1.0(舍入问题),C会发生什么?


给出一个带有
的直角三角形 身高A = dist = abs(x - l[i].x)w = abs(xs - lights[j])
宽度B = yys
斜边C = md
角度ang对面A

ang是asin(dist / m)
ang是atan(w / ys)= atan2(w,ys)