计算2个点之间的角度

25

已知点P1和P2,如何获取从点P1到点P2的角度?谢谢。


11
作为一名学究,两个点之间并不存在夹角,但两个向量之间却存在。请了解一下点积,看看你能从中得到什么信息。 - GManNickG
3
我认为OP的意思是P1和P2之间直线与x轴的夹角。至少,这就是所选答案所做的。 - mehfoos yacoob
3个回答

57

这只是一个简单的 float angle = atan2(p1.y - p2.y, p1.x - p2.x)

当然,返回类型为弧度制,如果你需要角度值,只需执行 angle * 180 / PI


6

好的,记得高中三角学。这是我得到的结果。

两个点是A(x1,y1)和B(x2,y2)

我假设你想要求出这两个点与原点O(0,0)之间的夹角。

每个点都形成一个三角形,由其高度、底边和斜边组成,因此你会得到两个角alpha1和alpha2。找到它们并计算所需的角度beta,方法是进行beta = alpha1 - alpha2,其中alpha1满足alpha1>alpha2。

计算alpha1 = inv_tan(y1/x1)和 alpha2 = inv_tan(y2/x2)

然后做beta = alpha1 - alpha2


1
其他答案的意思相同,但更为简洁。 - Ankur

4
//This working code is for windows hdc mouse coords gives the angle back that is used in windows. It assumes point 1 will be your origin point
// Tested and working on VS 2017 using 2 mouse coordinates in hdc.
//
//code to call our function.
float angler = get_angle_2points(Point1X, Point1Y, Point2X, Point2Y);


// Takes 2 Window coords(points), turns them into vectors using the origin and calculates the angle around the xaxis between them.
// This function can be used for any hdc window. Ie 2 mouse points.
float get_angle_2points(int p1x, int p1y, int p2x,int p2y)
{
    //Make point1 the origin, make point2 relative to the origin so we do point1 - point1, and point2-point1,
    //since we dont need point1 for the equation to work, the equation works correctly with the origin 0,0.
    int deltaY = p2y - p1y;
    int deltaX = p2x - p1x; //Vector 2 is now relative to origin, the angle is the same, we have just transformed it to use the origin.

    float angleInDegrees = atan2(deltaY, deltaX) * 180 / 3.141;

    angleInDegrees *= -1; // Y axis is inverted in computer windows, Y goes down, so invert the angle.

    //Angle returned as:
    //                      90
    //            135                45
    //
    //       180          Origin           0
    //
    //           -135                -45
    //
    //                     -90


    // returned angle can now be used in the c++ window function used in text angle alignment. ie plf->lfEscapement = angle*10;
    return angleInDegrees;
}

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