【问题标题】:Why did atan2 give me different values from asin?为什么 atan2 给了我与 asin 不同的值?
【发布时间】:2013-08-28 01:49:41
【问题描述】:

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

这是C语言中的sn-p代码:

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中的sn-p代码:

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);
        }
     }

谁能解释一下这个问题?

【问题讨论】:

  • 因为 atan2 != asin !!
  • 但是在 Java 中使用 atan2 给了我与在 C 中使用 asin 相同的角度。为什么?!在 C 中使用 atan2 给了我与在 Java 中使用 atan2 不同的角度。为什么?!

标签: trigonometry atan2


【解决方案1】:

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

【讨论】:

  • 但是为什么在 Java 中使用 atan2 可以很好地获得相同的角度?
【解决方案2】:

(参见下面的设置条件)

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

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

第一个预感是 OP 没有以正确的顺序使用 C atan2() 参数。 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 = md
角度ang对面A

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2021-03-10
    相关资源
    最近更新 更多