0

我试图计算直角三角形的角度值。侧面是相反的,斜边也恰好与角度相邻。用 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);
        }
     }

任何人都可以对这个问题有所了解吗?

4

2 回答 2

0

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

于 2013-08-28T01:57:22.497 回答
0

(见下面的设置条件)

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

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

第一个预感是 OP 没有atan2()以正确的顺序使用 C 参数。C 和 Java 以相同的顺序 (y,x) 使用 atan2()。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 =m或对边 A 的 d
角度ang

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

于 2013-08-29T19:10:49.270 回答