123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /****************************************************************************
- Copyright (c) 2008-2010 Ricardo Quesada
- Copyright (c) 2011-2012 cocos2d-x.org
- Copyright (c) 2013-2014 Chukong Technologies Inc.
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- /**
- * <p>cc.AffineTransform class represent an affine transform matrix. It's composed basically by translation, rotation, scale transformations.<br/>
- * Please do not use its constructor directly, use cc.affineTransformMake alias function instead.
- * </p>
- * @class cc.AffineTransform
- * @param {Number} a
- * @param {Number} b
- * @param {Number} c
- * @param {Number} d
- * @param {Number} tx
- * @param {Number} ty
- * @see cc.affineTransformMake
- */
- cc.AffineTransform = function (a, b, c, d, tx, ty) {
- this.a = a;
- this.b = b;
- this.c = c;
- this.d = d;
- this.tx = tx;
- this.ty = ty;
- };
- /**
- * Create a cc.AffineTransform object with all contents in the matrix
- * @function
- *
- * @param {Number} a
- * @param {Number} b
- * @param {Number} c
- * @param {Number} d
- * @param {Number} tx
- * @param {Number} ty
- * @return {cc.AffineTransform}
- */
- cc.affineTransformMake = function (a, b, c, d, tx, ty) {
- return {a: a, b: b, c: c, d: d, tx: tx, ty: ty};
- };
- /**
- * Apply the affine transformation on a point.
- * @function
- *
- * @param {cc.Point} point
- * @param {cc.AffineTransform} t
- * @return {cc.Point}
- */
- cc.pointApplyAffineTransform = function (point, t) {
- return {x: t.a * point.x + t.c * point.y + t.tx, y: t.b * point.x + t.d * point.y + t.ty};
- };
- cc._pointApplyAffineTransform = function (x, y, t) {
- return {x: t.a * x + t.c * y + t.tx,
- y: t.b * x + t.d * y + t.ty};
- };
- /**
- * Apply the affine transformation on a size.
- * @function
- *
- * @param {cc.Size} size
- * @param {cc.AffineTransform} t
- * @return {cc.Size}
- */
- cc.sizeApplyAffineTransform = function (size, t) {
- return {width: t.a * size.width + t.c * size.height, height: t.b * size.width + t.d * size.height};
- };
- /**
- * <p>Create a identity transformation matrix: <br/>
- * [ 1, 0, 0, <br/>
- * 0, 1, 0 ]</p>
- * @function
- *
- * @return {cc.AffineTransform}
- */
- cc.affineTransformMakeIdentity = function () {
- return {a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0};
- };
- /**
- * <p>Create a identity transformation matrix: <br/>
- * [ 1, 0, 0, <br/>
- * 0, 1, 0 ]</p>
- * @function
- *
- * @return {cc.AffineTransform}
- * @deprecated since v3.0, please use cc.affineTransformMakeIdentity() instead
- * @see cc.affineTransformMakeIdentity
- */
- cc.affineTransformIdentity = function () {
- return {a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0};
- };
- /**
- * Apply the affine transformation on a rect.
- * @function
- *
- * @param {cc.Rect} rect
- * @param {cc.AffineTransform} anAffineTransform
- * @return {cc.Rect}
- */
- cc.rectApplyAffineTransform = function (rect, anAffineTransform) {
- var top = cc.rectGetMinY(rect);
- var left = cc.rectGetMinX(rect);
- var right = cc.rectGetMaxX(rect);
- var bottom = cc.rectGetMaxY(rect);
- var topLeft = cc._pointApplyAffineTransform(left, top, anAffineTransform);
- var topRight = cc._pointApplyAffineTransform(right, top, anAffineTransform);
- var bottomLeft = cc._pointApplyAffineTransform(left, bottom, anAffineTransform);
- var bottomRight = cc._pointApplyAffineTransform(right, bottom, anAffineTransform);
- var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- return cc.rect(minX, minY, (maxX - minX), (maxY - minY));
- };
- cc._rectApplyAffineTransformIn = function(rect, anAffineTransform){
- var top = cc.rectGetMinY(rect);
- var left = cc.rectGetMinX(rect);
- var right = cc.rectGetMaxX(rect);
- var bottom = cc.rectGetMaxY(rect);
- var topLeft = cc._pointApplyAffineTransform(left, top, anAffineTransform);
- var topRight = cc._pointApplyAffineTransform(right, top, anAffineTransform);
- var bottomLeft = cc._pointApplyAffineTransform(left, bottom, anAffineTransform);
- var bottomRight = cc._pointApplyAffineTransform(right, bottom, anAffineTransform);
- var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- rect.x = minX;
- rect.y = minY;
- rect.width = maxX - minX;
- rect.height = maxY - minY;
- return rect;
- };
- /**
- * Create a new affine transformation with a base transformation matrix and a translation based on it.
- * @function
- *
- * @param {cc.AffineTransform} t The base affine transform object
- * @param {Number} tx The translation on x axis
- * @param {Number} ty The translation on y axis
- * @return {cc.AffineTransform}
- */
- cc.affineTransformTranslate = function (t, tx, ty) {
- return {
- a: t.a,
- b: t.b,
- c: t.c,
- d: t.d,
- tx: t.tx + t.a * tx + t.c * ty,
- ty: t.ty + t.b * tx + t.d * ty
- };
- };
- /**
- * Create a new affine transformation with a base transformation matrix and a scale based on it.
- * @function
- * @param {cc.AffineTransform} t The base affine transform object
- * @param {Number} sx The scale on x axis
- * @param {Number} sy The scale on y axis
- * @return {cc.AffineTransform}
- */
- cc.affineTransformScale = function (t, sx, sy) {
- return {a: t.a * sx, b: t.b * sx, c: t.c * sy, d: t.d * sy, tx: t.tx, ty: t.ty};
- };
- /**
- * Create a new affine transformation with a base transformation matrix and a rotation based on it.
- * @function
- * @param {cc.AffineTransform} aTransform The base affine transform object
- * @param {Number} anAngle The angle to rotate
- * @return {cc.AffineTransform}
- */
- cc.affineTransformRotate = function (aTransform, anAngle) {
- var fSin = Math.sin(anAngle);
- var fCos = Math.cos(anAngle);
- return {a: aTransform.a * fCos + aTransform.c * fSin,
- b: aTransform.b * fCos + aTransform.d * fSin,
- c: aTransform.c * fCos - aTransform.a * fSin,
- d: aTransform.d * fCos - aTransform.b * fSin,
- tx: aTransform.tx,
- ty: aTransform.ty};
- };
- /**
- * Concatenate a transform matrix to another and return the result:<br/>
- * t' = t1 * t2
- * @function
- * @param {cc.AffineTransform} t1 The first transform object
- * @param {cc.AffineTransform} t2 The transform object to concatenate
- * @return {cc.AffineTransform} The result of concatenation
- */
- cc.affineTransformConcat = function (t1, t2) {
- return {a: t1.a * t2.a + t1.b * t2.c, //a
- b: t1.a * t2.b + t1.b * t2.d, //b
- c: t1.c * t2.a + t1.d * t2.c, //c
- d: t1.c * t2.b + t1.d * t2.d, //d
- tx: t1.tx * t2.a + t1.ty * t2.c + t2.tx, //tx
- ty: t1.tx * t2.b + t1.ty * t2.d + t2.ty}; //ty
- };
- /**
- * Return true if an affine transform equals to another, false otherwise.
- * @function
- * @param {cc.AffineTransform} t1
- * @param {cc.AffineTransform} t2
- * @return {Boolean}
- */
- cc.affineTransformEqualToTransform = function (t1, t2) {
- return ((t1.a === t2.a) && (t1.b === t2.b) && (t1.c === t2.c) && (t1.d === t2.d) && (t1.tx === t2.tx) && (t1.ty === t2.ty));
- };
- /**
- * Get the invert transform of an AffineTransform object
- * @function
- * @param {cc.AffineTransform} t
- * @return {cc.AffineTransform} The inverted transform object
- */
- cc.affineTransformInvert = function (t) {
- var determinant = 1 / (t.a * t.d - t.b * t.c);
- return {a: determinant * t.d, b: -determinant * t.b, c: -determinant * t.c, d: determinant * t.a,
- tx: determinant * (t.c * t.ty - t.d * t.tx), ty: determinant * (t.b * t.tx - t.a * t.ty)};
- };
|