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

但是无论高度和方位角是多少,clax、clay 和 claz 不是 0 就是 1。

我确定我犯了一个错误,在这之后我会笑我是多么愚蠢。但实际上,我不知道为什么这不起作用,为什么每个值只给出 1 或 0 ......

4

3 回答 3

3

很可能,您声明clax为某种整数类型(例如int, long, ...)。否则,Altitude或者Azimuth可能被声明为整数类型。2*pi在这种情况下,您总是会在三角函数的参数中得到倍数。

于 2012-08-12T03:35:37.023 回答
1

问题很可能是除法Altitude/360Azimuth/360,何时AltitudeAzimuth是整数。这将执行整数除法,您会丢失分数。作为一个说明性的例子,试试这个代码

#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

正如其他人所说,确保所有变量都是浮点数/双精度数。还要检查 XM_PI 是什么。如果它以某种方式为 0,那将解释您的结果。

于 2012-08-12T08:53:06.233 回答