7

好的,首先道歉,因为我知道这种问题已经不止一次被问过。然而,即使在查看了其他问题和答案之后,我也无法让它适用于我的情况。请参阅下面的示例: 图。1

我只是想计算出 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。

所以我只是想知道是否有人可以指出我做错了什么来计算这个,或者甚至可以这样做吗?

4

3 回答 3

5

atan2(Y,X)在具有逆时针正方向的标准笛卡尔坐标系中计算点相(X,Y)对于通过 的光线的角度(1,0). 这意味着X在您的情况下,它是沿零角度射线的坐标X=-difY,并且Y是(小)正角方向上的坐标,根据您的偏好,描绘的角度为 45° Y=difX。因此

double rotAng = Math.toDegrees(Math.atan2(difX,-difY));
于 2015-03-25T15:21:54.267 回答
3

您对几何中使用的坐标系与计算机屏幕上使用的坐标系感到困惑。在几何中,您通常认为 0,0 是左下角的一个点。但是屏幕上的 0,0 位于左上角。

现在,根据屏幕坐标旋转你的图片,看看角度计算是否正确。

因此,在一般情况下,您可以选择以下解决方案之一: 1. 重新计算您的点的坐标以筛选坐标并返回。2. 如果您的问题只是角度问题,您可以将 π/2(90 度)添加到结果中。

于 2015-03-25T15:03:38.080 回答
1

使用您的 line 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。

于 2015-03-25T15:16:44.003 回答