我的Android应用程序中有一个方法如下:
//get point after rotation
public static PointF getRotatedPoint(PointF pt,PointF center, float degrees)
{
double angleInRadians = degrees * (Math.PI / 180);
pt.x = (float) (Math.cos(angleInRadians) * (pt.x-center.x) - Math.sin(angleInRadians) * (pt.y-center.y) + center.x);
pt.y = (float) (Math.sin(angleInRadians) * (pt.x-center.x) + Math.cos(angleInRadians) * (pt.y-center.y) + center.y);
return pt;
}
我有一个旋转45度的矩形。我可以触摸旋转矩形上的任何一点,如果矩形没有旋转,它会给我一个触摸点,我想得到点的坐标。所以我在度数参数中传入-45。我就是这样称呼的:
getRotatedPoint(touchedPoint, centerOfRectangle,-45);
当我在旋转之前在矩形上绘制点时,它会给我一个接近我在旋转的矩形上触摸的位置的结果但是偏差相当大。
这是一张解释我问题的图片:
我认为这可能是我的数学问题,所以我们非常感谢任何答案。
答案 0 :(得分:2)
您正在计算中混合初始值和最终值。您重新分配pt.x
:
pt.x = (float) (Math.cos(angleInRadians) * (pt.x-center.x) - Math.sin(angleInRadians) * (pt.y-center.y) + center.x);
不会立即造成任何问题。但pt.y
的计算依赖于pt.x
的原始值,而非旋转值:
pt.y = (float) (Math.sin(angleInRadians) * (pt.x-center.x) + Math.cos(angleInRadians) * (pt.y-center.y) + center.y);
因此,只需使用一些临时变量来保存初始值。
public static PointF getRotatedPoint(PointF pt,PointF center, float degrees)
{
double x0 = pt.x;
double y0 = pt.y;
double angleInRadians = degrees * (Math.PI / 180);
pt.x = (float) (Math.cos(angleInRadians) * (x0-center.x) - Math.sin(angleInRadians) * (y0-center.y) + center.x);
pt.y = (float) (Math.sin(angleInRadians) * (x0-center.x) + Math.cos(angleInRadians) * (y0-center.y) + center.y);
return pt;
}