0

直角三角形の角度の値を計算しようとしていました。側面は反対で、斜辺もたまたま角度に隣接しています。Java で記述された 1 つのコードは、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

(以下の設定条件を参照)

OPは次のよ​​うに尋ねます:「Javaでatan2を使用すると、Cでasinを使用するのと同じ角度が得られます.なぜですか?」.
それは単純に、sin(ang) = 反対/斜辺 = dist/m および tan(ang) = 反対/隣接 = w/ys.

OPは次のよ​​うに尋ねます:「Cでatan2を使用すると、Javaでatan2を使用するのとは異なる角度が得られます.なぜですか?」OPは問題のあるコードを投稿しなかった
ため、これは非常に厄介です。OPは、これらの異なる値のいくつかが何であるかを述べたり、テストデータを提供したりしませんでした. 知識に基づいた推測が残されています。

atan2()最初の予感は、OP が正しい順序で C パラメータを使用しなかったことです。C と Java は、同じ順序 (y、x) で atan2() を使用します。Excel では (x,y) の順序が使用されます。OP がパラメータに名前yを付けた変数を使用していることを考えるとx、これは合理的です。

2番目のアイデアは、OPがCで同じ側面を使用しなかったことatan2(dist, y)です。

3番目のアイデアには、サイン(サインではない)の問題があります。テストデータが必要です。


M_PI の代わりに 3.14159265 を使用する理由など、コードには他にも微妙な問題があります。dist/m が 1.0 を少し上回っている場合 (丸めの問題)、C ではどうなりますか?



高さ A =dist = abs(x - l[i].x)またはw = abs(xs - lights[j])
幅 B =yまたはys
斜辺 C =mまたは対辺 A の d
直角三角形を考えるang

angasin(dist/m)
であり、angatan(w/ys) = atan2(w, ys) です。

于 2013-08-29T19:10:49.270 に答える
0

反対/斜辺 = 正弦なので、角度を得るには asin を使用する必要があります。

于 2013-08-28T01:57:22.497 に答える