java - 为什么我的围绕另一个点旋转一个点的方法不起作用?

标签 java rotation trigonometry

我的 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);

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

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

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

最佳答案

您在计算中混合了初始值和最终值。您重新分配 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;
}

关于java - 为什么我的围绕另一个点旋转一个点的方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455648/

相关文章:

ios - Scenekit - 基于世界轴的旋转子子节点的 convertTransform

java - 使用扫描生成正弦音 - Android

java - 在 Freemarker 中包含带有变量的模板

java - Hibernate PreUpdateEventListener 不起作用

java - 实现 URL 过滤器

javascript - 从点到圆 Angular 矩形或椭圆的最长距离

javascript - 从 x、y、宽度、高度和旋转中获取旋转的矩形点

java - Eclipse 中 JAR 的离线 JavaDocs

java - LWJGL:根据鼠标位置旋转四边形

c# - 如何在Windows Phone 8 中连续旋转?