【问题标题】:Android - getting the current rotation of a matrixAndroid - 获取矩阵的当前旋转
【发布时间】:2011-09-03 03:50:50
【问题描述】:

我需要能够设置矩阵的旋转而不是添加到它。我相信设置旋转的唯一方法是知道矩阵的当前旋转。

注意:matrix.setRotate() 不行,因为矩阵需要保留它的信息。

【问题讨论】:

    标签: java android matrix


    【解决方案1】:
    float[] v = new float[9];
    matrix.getValues(v);
    // translation is simple
    float tx = v[Matrix.MTRANS_X];
    float ty = v[Matrix.MTRANS_Y];
    
    // calculate real scale
    float scalex = v[Matrix.MSCALE_X];
    float skewy = v[Matrix.MSKEW_Y];
    float rScale = (float) Math.sqrt(scalex * scalex + skewy * skewy);
    
    // calculate the degree of rotation
    float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI));
    

    从这里 http://judepereira.com/blog/calculate-the-real-scale-factor-and-the-angle-of-rotation-from-an-android-matrix/

    【讨论】:

    • 我使用 float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI)) 计算了旋转;需要乘以 -1 才能得到正确的值。为什么会这样?
    • 我将支持@VV 的评论;旋转方向错误而没有否定。
    • @Project : -ve 对我来说是一个错误,矩阵的顺序不同。但我仍然需要应用 setPivotX(0); setPivotY(0);旋转后得到准确的位置为什么会这样
    • 当 scaleX 和 scaleY 具有不同的值时,获取度数旋转出错。
    【解决方案2】:

    您可以调用getValues 并缓存这些值。稍后当您希望他们回来时,只需在矩阵上调用 setValues

    更新

    旋转矩阵和变换矩阵关系很好解释here

    【讨论】:

    • getValue 返回一个float数组,哪个索引是旋转?
    • 我已将其标记为已接受的答案,因为您为我提供了一种查找轮换的方法。虽然我最终选择了一个更简单的解决方案。我的解决方案是自己跟踪当前的旋转,而不是通过矩阵找到它。我觉得这种方式既简单又高效。
    【解决方案3】:

    恐怕我无法帮助您进行集成(我只在 Flash 中完成了此操作),但听起来您应该尝试自己进行矩阵计算,最好使用“四元数”来完成,这使得添加旋转非常简单。有关 Java 实现的示例,请参阅 http://introcs.cs.princeton.edu/java/32class/Quaternion.java.html。您可能希望创建第二个四元数矩阵来描述您的旋转变化并将其添加(在本例中为plus)到您当前的矩阵中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2021-07-17
      相关资源
      最近更新 更多