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

时间:2010-06-30 22:24:18

标签: c# math geometry drawing

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

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

6 个答案:

答案 0 :(得分:9)

您可以使用atan

angle = atan((By-Ay)/(Bx-Ax))

答案 1 :(得分:8)

    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;
    }

答案 2 :(得分:1)

如果

  1. 角度很小,
  2. 你可以忍受小的不准确,
  3. 您可以使用弧度而不是度数的角度,
  4. 然后有一个快速的解决方案:在这些条件下,你可以假设tan(a)= a = atan(a),因此只是省略了atan()调用。

答案 3 :(得分:1)

如果您的行的格式为[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)

以使其成为单位矢量。

答案 4 :(得分:0)

x轴实际上是具有等式

的线
  

y = 0

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

答案 5 :(得分: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;
}