14

可能重复:
如何计算两点之间相对于水平轴的角度?

我一直在寻找这个很久了,它真的很烦我,所以我决定只是问......

假设我有两个点(即 x1,y1 和 x2,y2),我想计算这两个点之间的角度,假设当 y1 == y2 和 x1 > x2 时,角度是 180 度...

我有以下我一直在使用的代码(使用高中的知识),但我似乎无法产生预期的结果。

float xDiff = x1 - x2;
float yDiff = y1 - y2;
return (float)Math.Atan2(yDiff, xDiff) * (float)(180 / Math.PI);

先谢谢了,我很沮丧...

4

1 回答 1

26

根据我收集到的信息,您希望保留以下内容:

  • 水平线:P1 -------- P2=> 0°
  • 水平线:P2 -------- P1=> 180°

顺时针旋转水平线

你说,你希望角度顺时针方向增加。

将这条线旋转P1 -------- P2P1上方P2,因此角度必须为 90°。

但是,如果我们朝相反的方向旋转,P1则会在下方P2且角度为 -90° 或 270°。

atan2

依据:考虑P1为原点,测量P2相对于原点的角度,即可P1 -------- P2正确屈服0

float xDiff = x2 - x1;
float yDiff = y2 - y1;
return Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI;

但是,atan2让我们在 CCW 方向上增加角度。绕原点逆时针方向旋转,y经过以下值:

  • y = 0
  • y > 0
  • y = 0
  • y < 0
  • y = 0

这意味着,我们可以简单地反转符号y来翻转方向。但是因为C#的坐标是从上往下递增的,所以在计算的时候符号已经反转了yDiff

于 2012-10-15T09:12:41.133 回答