计算由两点定义的线之间的angular度

我目前正在为Android开发一个简单的2D游戏。 我有一个位于屏幕中心的静止物体,我试图让这个物体旋转,并指向用户触摸屏幕上的区域。 我有恒定的坐标,代表屏幕的中心,我可以得到用户点击的坐标。 我正在使用这个论坛中列出的公式: 如何获得两点之间的angular度?

Solutions Collecting From Web of "计算由两点定义的线之间的angular度"

假设: x是横轴,从左向右移动时增加。 y是纵轴,从下到上增加。 (touch_x, touch_y)是用户select的点。 (center_x, center_y)是屏幕中心的点。 theta+x轴逆时针测量。 然后:

 delta_x = touch_x - center_x delta_y = touch_y - center_y theta_radians = atan2(delta_y, delta_x) 

编辑 :你在评论中提到,从上到下增加。 在这种情况下,

 delta_y = center_y - touch_y 

但是,将其描述为在相对于(center_x, center_y)极坐标中表示(touch_x, touch_y)会更加正确。 正如ChrisF所说,采取“两点夹angular”的想法还没有很好的界定。

自己需要类似的function,所以经过多次拉动我想出了下面的function

 /** * Fetches angle relative to screen centre point * where 3 O'Clock is 0 and 12 O'Clock is 270 degrees * * @param screenPoint * @return angle in degress from 0-360. */ public double getAngle(Point screenPoint) { double dx = screenPoint.getX() - mCentreX; // Minus to correct for coord re-mapping double dy = -(screenPoint.getY() - mCentreY); double inRads = Math.atan2(dy, dx); // We need to map to coord system when 0 degree is at 3 O'clock, 270 at 12 O'clock if (inRads < 0) inRads = Math.abs(inRads); else inRads = 2 * Math.PI - inRads; return Math.toDegrees(inRads); } 

这里有一些答案试图解释top left0,0bottom right是(正) screen width, screen height的“屏幕”问题。 大多数网格的Y轴在X以上不低于正值。

以下方法将使用屏幕值而不是“网格”值。 唯一不同的答案是Y值倒置。

 /** * Work out the angle from the x horizontal winding anti-clockwise * in screen space. * * The value returned from the following should be 315. * <pre> * x,y ------------- * | 1,1 * | \ * | \ * | 2,2 * </pre> * @param p1 * @param p2 * @return - a double from 0 to 360 */ public static double angleOf(PointF p1, PointF p2) { // NOTE: Remember that most math has the Y axis as positive above the X. // However, for screens we have Y as positive below. For this reason, // the Y values are inverted to get the expected results. final double deltaY = (p1.y - p2.y); final double deltaX = (p2.x - p1.x); final double result = Math.toDegrees(Math.atan2(deltaY, deltaX)); return (result < 0) ? (360d + result) : result; } 

如果你认为y坐标是相反的,只是否定了数值。 答案更有意义吗?

“原点位于屏幕的左上方,Y坐标增加,X坐标增加到正常,我猜我的问题是,我必须把屏幕坐标转换成笛卡尔坐标在应用上述公式之前?

如果使用笛卡尔坐标计算angular度,并且两个点位于象限1(其中x> 0且y> 0),则情况将与屏幕像素坐标相同(除了倒置的Y事物。否定Y正确的,它成为象限4 …)。 将屏幕像素坐标转换为笛卡儿并不会真正改变angular度。