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.
* *

The computed result must be within 2 ulps of the exact result. * Results must be semi-monotonic. * * @param y the ordinate coordinate * @param x the abscissa coordinate * @return the 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);

你可能感兴趣的:(ATAN2根据xy坐标计算角度)