0

現在、Mathworks、Sph2Cart の Matlab の式を使用して、2 つの角度を x、y、z に変換しようとしています。

http://www.mathworks.com/help/techdoc/ref/sph2cart.html

アルゴリズム:

x = r .* cos(elevation) .* cos(azimuth)
y = r .* cos(elevation) .* sin(azimuth)
z = r .* sin(elevation)

C++ の場合

clax = 1 * cos((Altitude/360)*(2*XM_PI)) * cos((Azimuth/360)*(2*XM_PI));
clay = 1 * sin((Altitude/360)*(2*XM_PI));
claz = 1 * cos((Altitude/360)*(2*XM_PI)) * sin((Azimuth/360)*(2*XM_PI));

ただし、Altitude と Azimuth が何であっても、clax、clay、claz は 0 または 1 です。

私は間違いを犯したと確信しており、この後、私がどれほど愚かだったかを笑います。しかし、実際には、なぜこれが機能しないのか、なぜ値がそれぞれに 1 または 0 しか与えられないのかわかりません...

4

3 に答える 3

3

おそらく、clax何らかの整数型 ( intlong、 ... など) として宣言しました。それ以外の場合、AltitudeまたはAzimuth整数型として宣言される可能性があります。2*piその場合、三角関数の引数には常に の倍数が含まれます。

于 2012-08-12T03:35:37.023 に答える
1

問題は、とが整数の場合の除算Altitude/360とである可能性が最も高いです。これにより、整数除算が実行され、分数が失われます。実例として、このコードを試してくださいAzimuth/360AltitudeAzimuth

#include <iostream>
#include <cmath>

int main()
{
    int angle = 90;
    std::cout << std::sin((angle/360)*(2*M_PI)) << std::endl;
    std::cout << std::sin((angle/360.0)*(2*M_PI)) << std::endl;
    std::cout << std::sin((angle/360.0)*(2.0*M_PI)) << std::endl;
    return 0;
}

出力する

0
1
1

最初のゼロは明らかに間違っていることに注意してください。

コードを修正するには、整数定数を360から double-constants に変更するだけ360.0です。

于 2012-08-12T08:25:29.367 に答える
1

これが役立つかどうかはわかりませんが、私にとってはうまくいきます....

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double XM_PI = 3.14159;
    double Altitude = 32;
    double Azimuth = 24;
    double clax = 1 * cos((Altitude/360)*(2*XM_PI)) * cos((Azimuth/360)*(2*XM_PI));
    double clay = 1 * sin((Altitude/360)*(2*XM_PI));
    double claz = 1 * cos((Altitude/360)*(2*XM_PI)) * sin((Azimuth/360)*(2*XM_PI));
    std::cout << "clax=" << clax << endl;
    std::cout << "clay=" << clay << endl;
    std::cout << "claz=" << claz << endl;
}

答え :

clax=0.774731
clay=0.529919
claz=0.344932

他の人が言ったように、すべての変数が float/double であることを確認してください。また、XM_PI とは何かを確認してください。どういうわけか0の場合、それはあなたの結果を説明します。

于 2012-08-12T08:53:06.233 に答える