extract rotation, scale values from 2d transformation matrix

后端 未结 4 2004
野性不改
野性不改 2020-11-30 20:24

how can i extract rotation, scale and translation values from 2d transformation matrix? i mean a have a 2d transformation

matrix = [1, 0, 0, 1, 0, 0]

matri         


        
4条回答
  •  感动是毒
    2020-11-30 21:03

    The term for this is matrix decomposition. Here is a solution that includes skew as described by Frédéric Wang.

    function decompose_2d_matrix(mat) {
      var a = mat[0];
      var b = mat[1];
      var c = mat[2];
      var d = mat[3];
      var e = mat[4];
      var f = mat[5];
    
      var delta = a * d - b * c;
    
      let result = {
        translation: [e, f],
        rotation: 0,
        scale: [0, 0],
        skew: [0, 0],
      };
    
      // Apply the QR-like decomposition.
      if (a != 0 || b != 0) {
        var r = Math.sqrt(a * a + b * b);
        result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);
        result.scale = [r, delta / r];
        result.skew = [Math.atan((a * c + b * d) / (r * r)), 0];
      } else if (c != 0 || d != 0) {
        var s = Math.sqrt(c * c + d * d);
        result.rotation =
          Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));
        result.scale = [delta / s, s];
        result.skew = [0, Math.atan((a * c + b * d) / (s * s))];
      } else {
        // a = b = c = d = 0
      }
    
      return result;
    }
    

提交回复
热议问题