从具有x轴的矢量计算角度(梯度)

时间:2012-03-21 19:52:40

标签: math vector 2d gradient trigonometry

我在cathesian 2D系统中有两个点,它们都给我一个向量的起点和终点。现在我需要新矢量和x轴之间的角度。

我知道渐变=(y2-y1)/(x2-x1),我知道这个角度= arctan(渐变)。

但我不知道这是否适用于矢量所采用的每种情况(方向)。 我什么时候需要添加180度或类似的东西。

任何人都可以为我提供一些c / java代码或所有案例的提示。

Thx和最好的问候

2 个答案:

答案 0 :(得分:6)

你可以使用点积(http://en.wikipedia.org/wiki/Dot_product)但是将它全部简化出来,你最终只需要采用矢量端点的反正切来获得它与x轴之间的角度。 Atan函数通常以[-pi,pi]或[-180,180]的顺序返回,所以如果你想确保它正确包装,你需要检查你的向量的y分量是否为负数。在C中,您可以使用atan2而不是atan,并且它将使用每个组件的符号来计算角度的符号(http://www.cplusplus.com/reference/clibrary/cmath/atan2/)。

例如,如果你有矢量点start =< 1,2>并且end =< -5,-5>,通过从结尾减去开始将其调整回原点,给你< -6,-7>。所以你在看这一点。与x轴的角度为atan2(y,x),atan2(-7,-6),为-130.6。

double x = -6;
double y = -7;

fprintf(stderr,"angle is %.2f\n",atan2(y,x)*180/3.14159);

角度为-130.60

答案 1 :(得分:0)

总而言之,当你有一个2D xy向量并需要在正X轴上找到0 \ 360度时,你可以这样做:

const float RAD2DEG = 180.0f / 3.14159f;

float x = -4.0f;
float y =  3.2f;

// atan2 receives first Y second X
double angle = atan2(y, x) * RAD2DEG;
if (angle < 0) angle += 360.0f;