C ++将角度转换为坐标

时间:2012-08-12 03:30:36

标签: c++ algorithm matlab formula

我正在尝试将2个角度转换为x,y,z,使用来自Mathworks的Matlab公式,Sph2Cart

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 ......

3 个答案:

答案 0 :(得分:3)

您很有可能将clax声明为某种整数类型(例如intlong,...)。否则,AltitudeAzimuth可能被声明为整数类型。在这种情况下,你总是会在三角函数的参数中找到2*pi的倍数。

答案 1 :(得分: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更改为双常数360.0

答案 2 :(得分: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,那将解释你的结果。

相关问题