我正在尝试将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)
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 ......
答案 0 :(得分:3)
您很有可能将clax
声明为某种整数类型(例如int
,long
,...)。否则,Altitude
或Azimuth
可能被声明为整数类型。在这种情况下,你总是会在三角函数的参数中找到2*pi
的倍数。
答案 1 :(得分:1)
当Altitude/360
和Azimuth/360
为整数时,问题很可能是分部Altitude
和Azimuth
。这将执行整数除法,您将松散分数。作为一个说明性示例,请尝试此代码
#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,那将解释你的结果。