我试图计算一个直角三角形的值。两侧是相反的,斜边也恰好与角度相邻。用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);
}
}
有人能解释一下这个问题吗?
答案 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 = y
或ys
斜边C = m
或d
角度ang
对面A
ang
是asin(dist / m)
而ang
是atan(w / ys)= atan2(w,ys)