0

我的 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 度的矩形。我可以触摸旋转矩形上的任何点,如果矩形没有旋转,它会给我想要获取该点坐标的触摸点。所以我在degrees参数中传入-45。我是这样称呼它的:

getRotatedPoint(touchedPoint, centerOfRectangle,-45);

当我在矩形旋转之前在矩形上绘制点时,它给我的结果接近我在旋转矩形上触摸的位置,但相差很大。

这是一张图片来解释我的问题: 解释

我认为这可能是我的数学问题,因此非常感谢任何答案。

4

1 回答 1

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;
}
于 2013-10-18T17:37:15.457 回答