【问题标题】:Rotate object and then translate it旋转对象然后平移它
【发布时间】:2013-09-27 08:27:29
【问题描述】:

我有一个由三个变量描述的对象(即矩形):x (int), y (int) - 对象的位置和 rangel (float) - 指示对象运动方向的角度。现在我想根据它的方向(天使)来翻译对象。我想出了如何计算它的新坐标:

x += (int)(shift*Math.sin(Math.toRadians(rangel));
y -= (int)(shift*Math.cos(Math.toRadians(rangel));

但我不确定这种方法是否足够有效。您现在是否有任何其他方式来执行此操作,但会比上面介绍的更快?谢谢。

【问题讨论】:

  • 你怎么知道它不够快?您是否分析了此代码?它是否会在您的应用程序中形成瓶颈?
  • "with it's direction (angel)" 你所说的这个词是“角度”——“天使”是那些带有翅膀的发光的天上精神之一。
  • “旋转对象然后翻译它”我会使用两个 AffineTransform 实例,连接在一起。

标签: java graphics rotation translate-animation


【解决方案1】:

根据this thread Math.sin 不一定使用最佳实现。 由于您已经转换为 int,我强烈建议使用一些近似值而不是 Math.sin。我发现this post 似乎为逼近 sin(x) 提供了一种既准确又快速的算法。我很确定您会找到 cos(x) 的近似值,或者可以从给定的解决方案中自行推导出它。

此外,我认为对于忽略小数精度的特殊情况,还有更快的近似值。

最好的问候, 山姆

【讨论】:

    【解决方案2】:

    这是将物体平移一个角度的正确方法。如果角度是任意的,那么就没有更快的方法了。

    【讨论】:

      【解决方案3】:

      首先计算Math.toRadians(rangel) 并将其存储在局部变量中可能会稍微快一些,因此您只需计算一次,而不是两次。但由此节省的资金将微乎其微。除此之外,这对我来说看起来非常理想。

      但请注意,如果 rangel 只有少量不同的可能值(例如,您只能在 24 个不同的方向上移动对象,或者类似的东西),那么您会得到一些通过使用 sincos 值的查找表来节省。

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多