Java: 确定两点之间的角度
Java: Determin angle between two points
好的,首先道歉,因为我知道这种问题已经被问过不止一次了。然而,即使在查看了其他问题和答案之后,我也无法让它适用于我的情况。请参阅下面的示例:
我只是想计算 P1 和 P2 之间的角度,假设 0 度如上所示,这样我就可以将 2 之间的箭头指向正确的方向。所以我做了这样的事情...
Point p1 = new Point(200,300); Point p2 = new Point(300,200);
double difX = p2.x - p1.x; double difY = p2.y - p1.y;
double rotAng = Math.toDegrees(Math.atan2(difY,difX));
结果为:-45,应该是 45?然而,这不仅仅是我认为它不会返回负结果的情况,例如,如果我将 P1 更改为 300,300(低于 P2),则角度应为 0,但返回为 -90.
所以我想知道是否有人可以指出我在计算时做错了什么,或者甚至可以这样做吗?
您混淆了几何中使用的坐标系与计算机屏幕上使用的坐标系。在几何学中,0,0 是左下角的一个点。但是屏幕上的 0,0 是左 - 上角。
现在,根据屏幕坐标旋转你的图片,看看角度是否计算正确。
因此,一般情况下您可以选择以下解决方案之一:
1. 重新计算点的坐标以屏幕坐标和返回。
2. 如果你的问题只是角度问题,你可以在结果中加上 π/2(90 度)。
用你的线 double difX = p2.x - p1.x; double difY = p2.y - p1.y;
,你计算的是从 p2 到 0 的角度,所以 -45 是正确答案。尝试用 p2 反转 p1。
此外,如果 P1 更改为 300,300,则角度为 0(0 到 P1 和 P1 到 P2)。角度确实是 90 度或 -90 度,具体取决于您是从 P2 到 0 还是从 0 到 P2。
atan2(Y,X)
在逆时针正方向的标准笛卡尔坐标系中计算点 (X,Y)
相对于通过 (1,0)
的光线的角度。这意味着 X
是沿零角度射线的坐标,在您的情况下 X=-difY
,而 Y
是(小)正角方向的坐标,它给出,您希望描绘的角度为 45°,Y=difX
。因此
double rotAng = Math.toDegrees(Math.atan2(difX,-difY));
好的,首先道歉,因为我知道这种问题已经被问过不止一次了。然而,即使在查看了其他问题和答案之后,我也无法让它适用于我的情况。请参阅下面的示例:
我只是想计算 P1 和 P2 之间的角度,假设 0 度如上所示,这样我就可以将 2 之间的箭头指向正确的方向。所以我做了这样的事情...
Point p1 = new Point(200,300); Point p2 = new Point(300,200);
double difX = p2.x - p1.x; double difY = p2.y - p1.y;
double rotAng = Math.toDegrees(Math.atan2(difY,difX));
结果为:-45,应该是 45?然而,这不仅仅是我认为它不会返回负结果的情况,例如,如果我将 P1 更改为 300,300(低于 P2),则角度应为 0,但返回为 -90.
所以我想知道是否有人可以指出我在计算时做错了什么,或者甚至可以这样做吗?
您混淆了几何中使用的坐标系与计算机屏幕上使用的坐标系。在几何学中,0,0 是左下角的一个点。但是屏幕上的 0,0 是左 - 上角。
现在,根据屏幕坐标旋转你的图片,看看角度是否计算正确。
因此,一般情况下您可以选择以下解决方案之一: 1. 重新计算点的坐标以屏幕坐标和返回。 2. 如果你的问题只是角度问题,你可以在结果中加上 π/2(90 度)。
用你的线 double difX = p2.x - p1.x; double difY = p2.y - p1.y;
,你计算的是从 p2 到 0 的角度,所以 -45 是正确答案。尝试用 p2 反转 p1。
此外,如果 P1 更改为 300,300,则角度为 0(0 到 P1 和 P1 到 P2)。角度确实是 90 度或 -90 度,具体取决于您是从 P2 到 0 还是从 0 到 P2。
atan2(Y,X)
在逆时针正方向的标准笛卡尔坐标系中计算点 (X,Y)
相对于通过 (1,0)
的光线的角度。这意味着 X
是沿零角度射线的坐标,在您的情况下 X=-difY
,而 Y
是(小)正角方向的坐标,它给出,您希望描绘的角度为 45°,Y=difX
。因此
double rotAng = Math.toDegrees(Math.atan2(difX,-difY));