1 /**
  2  * Returns a new identity transform.
  3  *
  4  * @class Represents a transformation matrix. The transformation matrix is
  5  * limited to expressing translate and uniform scale transforms only; shearing,
  6  * rotation, general affine, and other transforms are not supported.
  7  *
  8  * <p>The methods on this class treat the transform as immutable, returning a
  9  * copy of the transformation matrix with the specified transform applied. Note,
 10  * alternatively, that the matrix fields can be get and set directly.
 11  */
 12 pv.Transform = function() {};
 13 pv.Transform.prototype = {k: 1, x: 0, y: 0};
 14 
 15 /**
 16  * The scale magnitude; defaults to 1.
 17  *
 18  * @type number
 19  * @name pv.Transform.prototype.k
 20  */
 21 
 22 /**
 23  * The x-offset; defaults to 0.
 24  *
 25  * @type number
 26  * @name pv.Transform.prototype.x
 27  */
 28 
 29 /**
 30  * The y-offset; defaults to 0.
 31  *
 32  * @type number
 33  * @name pv.Transform.prototype.y
 34  */
 35 
 36 /**
 37  * @private The identity transform.
 38  *
 39  * @type pv.Transform
 40  */
 41 pv.Transform.identity = new pv.Transform();
 42 
 43 // k 0 x   1 0 a   k 0 ka+x
 44 // 0 k y * 0 1 b = 0 k kb+y
 45 // 0 0 1   0 0 1   0 0 1
 46 
 47 /**
 48  * Returns a translated copy of this transformation matrix.
 49  *
 50  * @param {number} x the x-offset.
 51  * @param {number} y the y-offset.
 52  * @returns {pv.Transform} the translated transformation matrix.
 53  */
 54 pv.Transform.prototype.translate = function(x, y) {
 55   var v = new pv.Transform();
 56   v.k = this.k;
 57   v.x = this.k * x + this.x;
 58   v.y = this.k * y + this.y;
 59   return v;
 60 };
 61 
 62 // k 0 x   d 0 0   kd  0 x
 63 // 0 k y * 0 d 0 =  0 kd y
 64 // 0 0 1   0 0 1    0  0 1
 65 
 66 /**
 67  * Returns a scaled copy of this transformation matrix.
 68  *
 69  * @param {number} k
 70  * @returns {pv.Transform} the scaled transformation matrix.
 71  */
 72 pv.Transform.prototype.scale = function(k) {
 73   var v = new pv.Transform();
 74   v.k = this.k * k;
 75   v.x = this.x;
 76   v.y = this.y;
 77   return v;
 78 };
 79 
 80 /**
 81  * Returns the inverse of this transformation matrix.
 82  *
 83  * @returns {pv.Transform} the inverted transformation matrix.
 84  */
 85 pv.Transform.prototype.invert = function() {
 86   var v = new pv.Transform(), k = 1 / this.k;
 87   v.k = k;
 88   v.x = -this.x * k;
 89   v.y = -this.y * k;
 90   return v;
 91 };
 92 
 93 // k 0 x   d 0 a   kd  0 ka+x
 94 // 0 k y * 0 d b =  0 kd kb+y
 95 // 0 0 1   0 0 1    0  0    1
 96 
 97 /**
 98  * Returns this matrix post-multiplied by the specified matrix <i>m</i>.
 99  *
100  * @param {pv.Transform} m
101  * @returns {pv.Transform} the post-multiplied transformation matrix.
102  */
103 pv.Transform.prototype.times = function(m) {
104   var v = new pv.Transform();
105   v.k = this.k * m.k;
106   v.x = this.k * m.x + this.x;
107   v.y = this.k * m.y + this.y;
108   return v;
109 };
110