ATAN2根据xy坐标计算角度

float centerX = v.getX() + (float) v.getWidth() / 2; float centerY = v.getY() + (float) v.getHeight() / 2; double angle = Math.atan2(touchRawY - centerY, touchRawX - centerX) * 180 / Math.PI; v.setRotation((float) angle - 45); // scale float xx = (touchRawX >= centerX ? deltaRawX : -deltaRawX); float yy = (touchRawY >= centerY ? deltaRawY : -deltaRawY); float sf = (v.getScaleX() + xx / v.getWidth() + v.getScaleY() + yy / v.getHeight()) / 2; v.setScaleX(sf); v.setScaleY(sf);

结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度。ATAN2(a, b) 与 ATAN(a/b)稍有不同,ATAN2(a,b)的取值范围介于 -pi 到 pi 之间(不包括 -pi),而ATAN(a/b)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。若要用度表示反正切值,请将结果再乘以 180/3.14159。另外要注意的是,函数atan2(y,x)中参数的顺序是倒置的,atan2(y,x)计算的值相当于点(x,y)的角度值。
/** * Returns the angle theta from the conversion of rectangular * coordinates ({@code x},  {@code y}) to polar * coordinates (r,  theta). * This method computes the phase theta by computing an arc tangent * of {@code y/x} in the range of -pi to pi. Special * cases: *
  • If either argument is NaN, then the result is NaN. *
  • If the first argument is positive zero and the second argument * is positive, or the first argument is positive and finite and the * second argument is positive infinity, then the result is positive * zero. *
  • If the first argument is negative zero and the second argument * is positive, or the first argument is negative and finite and the * second argument is positive infinity, then the result is negative zero. *
  • If the first argument is positive zero and the second argument * is negative, or the first argument is positive and finite and the * second argument is negative infinity, then the result is the * {@code double} value closest to pi. *
  • If the first argument is negative zero and the second argument * is negative, or the first argument is negative and finite and the * second argument is negative infinity, then the result is the * {@code double} value closest to -pi. *
  • If the first argument is positive and the second argument is * positive zero or negative zero, or the first argument is positive * infinity and the second argument is finite, then the result is the * {@code double} value closest to pi/2. *
  • If the first argument is negative and the second argument is * positive zero or negative zero, or the first argument is negative * infinity and the second argument is finite, then the result is the * {@code double} value closest to -pi/2. *
  • If both arguments are positive infinity, then the result is the * {@code double} value closest to pi/4. *
  • If the first argument is positive infinity and the second argument * is negative infinity, then the result is the {@code double} * value closest to 3*pi/4. *
  • If the first argument is negative infinity and the second argument * is positive infinity, then the result is the {@code double} value * closest to -pi/4. *
  • If both arguments are negative infinity, then the result is the * {@code double} value closest to -3*pi/4.
* * 【ATAN2根据xy坐标计算角度】The computed result must be within 2 ulps of the exact result. * Results must be semi-monotonic. * * @paramythe ordinate coordinate * @paramxthe abscissa coordinate * @returnthe theta component of the point *(rtheta) *in polar coordinates that corresponds to the point *(xy) in Cartesian coordinates. */ @FastNative public static native double atan2(double y, double x);

    推荐阅读