从向量与x轴的夹角计算角度(梯度)

3
在笛卡尔2D系统中,我有两个点,它们均给出向量的起始点和终点。现在,我需要知道新向量与x轴之间的夹角。
我知道梯度 = (y2-y1) / (x2-x1),并且我知道角度 = arctan(gradient)。
但是我不知道这是否适用于向量采取的每种情况(方向)。什么情况下需要添加180度或类似的内容。
能否提供一些类似c/java的代码或提示来解决所有情况的问题。
谢谢,最好的问候。

1
“有人能提供一些类似于C / Java的代码吗”并不是一个问题。展示一些代码,描述你遇到的困难,我们会帮助你改进它。 - abelenky
可能是重复的问题:查找两点之间相对于水平轴的角度? - BlueRaja - Danny Pflughoeft
2个回答

7
您可以使用点积 (http://en.wikipedia.org/wiki/Dot_product),但简化后,您最终只需要取向量末端的反正切值即可得到它与 x 轴之间的夹角。 反正切函数通常返回 [-pi,pi] 或 [-180,180] 的值,因此如果您想确保它正确地包装,您需要检查向量的 y 分量是否为负。 在 C 中,您可以使用 atan2 而不是 atan,它将使用每个分量的符号来确定角度的符号 (http://www.cplusplus.com/reference/clibrary/cmath/atan2/)。
例如,如果您有矢量起点为 <1,2> 且终点为 <-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


3
长话短说,您需要使用 atan2。 - rutgersmike

1

总结一下,当你有一个二维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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接