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
*(r,
theta)
*in polar coordinates that corresponds to the point
*(x,
y) in Cartesian coordinates.
*/
@FastNative
public static native double atan2(double y, double x);
推荐阅读
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 十一、理解纹理坐标
- 运营是什么()
- 2.关于OpenGL|2.关于OpenGL 坐标系以及渲染流程
- 周检视5/14-5/21(第三周)
- Arcgis根据经纬度批量提取属性值
- 2018-11-29|2018-11-29 今早新闻| Chenie
- [记录]根据经纬度计算两点间的距离
- 2021-02-25|2021-02-25 - 阅读营早会复盘
- 2020.1.4我的一天