从地平线获得一条线的角度

我想知道如何从水平轴X获得AB线的角度.SO中的其他问题仅在两条线之间进行。 我知道我总是可以绘制二线AC并计算,但我想知道是否有更快的方法。

编辑:我很确定我没有做过早优化。

你可以使用atan

 angle = atan((By-Ay)/(Bx-Ax)) 
  private double Angulo(int x1, int y1, int x2, int y2) { double degrees; // Avoid divide by zero run values. if (x2 - x1 == 0) { if (y2 > y1) degrees = 90; else degrees = 270; } else { // Calculate angle from offset. double riseoverrun = (double)(y2 - y1) / (double)(x2 - x1); double radians = Math.Atan(riseoverrun); degrees = radians * ((double)180 / Math.PI); // Handle quadrant specific transformations. if ((x2 - x1) < 0 || (y2 - y1) < 0) degrees += 180; if ((x2 - x1) > 0 && (y2 - y1) < 0) degrees -= 180; if (degrees < 0) degrees += 360; } return degrees; } 

如果

  1. 角度很小,
  2. 你可以忍受小的不准确,和
  3. 您可以使用弧度而不是度数的角度,

然后有一个快速的解决方案:在这些条件下,你可以假设tan(a)= a = atan(a),因此只省略atan()调用。

如果你的线的forms是[r_x,r_y] ,你也可以使用[r_x,r_y] ,其中r_x是x的变化, r_y是y的变化。

 angle = arccos( r_x/( r_x*r_x + r_y*r_y ) ) 

它稍微不透明,但它基本上是点积定律:

 angle = arccos (r . v) 

其中rv都是单位向量(长度为1的向量)。 在我们的例子中, v是向量[1,0] ,r是

 [r_x,r_y] / (r_x^2+r_y^2) 

为了使它成为一个单位向量。

x轴实际上是一个带方程的线

y = 0

所以你可以使用你已经拥有的解决方案。

如果您需要所有四个象限,Atan2比Atan更合适。

 public static int GetAngleBetweenPoints(PointF pt1, PointF pt2) { float dx = pt2.X - pt1.X; float dy = pt2.Y - pt1.Y; int deg = Convert.ToInt32(Math.Atan2(dy, dx) * (180 / Math.PI)); if (deg < 0) { deg += 360; } return deg; }