我想知道如何从水平轴X获得A-B线的角度.SO中的其他问题仅在两条线之间进行。我知道我总是可以绘制第二行A-C并计算,但我想知道是否有更快的方法。
编辑:我非常确定我没有做过早优化。答案 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)
如果
然后有一个快速的解决方案:在这些条件下,你可以假设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)
其中r
和v
都是单位向量(长度为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;
}