A Disturbing Strangeness

January 17, 2012

Matrice 2D en AS3

Filed under: programming — Tags: , , — Orbito @ 12:29 pm
package math {
	/**
	 * @author orbito
	 */
	public class Matrix2D {
		public var 	a : Number,
		b : Number,
		c : Number,
		d : Number,
		tx : Number,
		ty : Number;

		public function Matrix2D() : void {
			this.a = 1;
			this.b = 0;
			this.c = 0;
			this.d = 1;

			this.tx = 1;
			this.ty = 0;
		}

		public function get determinant() : Number {
			return (a * d - b * c);
		}

		public function get position() : Vector2D {
			return new Vector2D(tx, ty);
		}

		public function set position(a : Vector2D) : void {
			tx = a.x;
			ty = a.y;
		}

		public function translate(dx : Number = 0, dy : Number = 0) : void {
			tx += dx;
			ty += dy;
		}

		public function scale(sx : Number = 1, sy : Number = 1) : void {
			a = a * sx;
			b = b * sx;
			c = c * sx;
			d = d * sy;

			tx = tx * sy;
			ty = ty * sy;
		}

		public function rot(radians : Number) : void {
			var m : Matrix2D = new Matrix2D;

			m.a = m.d = Math.cos(radians);
			m.c = Math.sin(radians);
			m.b = -m.c;

			deltaCombine(m);
		}

		public function deltaCombine(lhs : Matrix2D) : void {
			var mat : Matrix2D = new Matrix2D;

			mat.a = lhs.a * a + lhs.b * c;
			mat.b = lhs.a * b + lhs.b * d;

			mat.c = lhs.c * a + lhs.d * c;
			mat.d = lhs.c * b + lhs.d * d;

			deltaCopy(mat);
		}

		public function clone() : Matrix2D {
			var mat : Matrix2D = new Matrix2D;
			mat.copy(this);
			return mat;
		}

		public function deltaCopy(mat : Matrix2D) : void {
			a = mat.a;
			b = mat.b;
			c = mat.c;
			d = mat.d;
		}

		public function copy(mat : Matrix2D) : void {
			a = mat.a;
			b = mat.b;
			c = mat.c;
			d = mat.d;
			tx = mat.tx;
			ty = mat.ty;
		}

		public function invert() : Boolean {
			var mat : Matrix2D = new Matrix2D;

			var det : Number = determinant;

			if (det == 0) return false;

			det = 1 / det;

			mat.a = d * det;
			mat.b = b * -det;
			mat.c = c * -det;
			mat.d = a * det;

			mat.tx = (b * ty - d * tx) * det;
			mat.ty = (c * tx - a * ty) * det;

			copy(mat);

			return true;
		}

		public function transformVector(v : Vector2D) : Vector2D {
			return new Vector2D(v.x * a + v.y * b + tx, v.x * c + v.y * d + ty);
		}
	}
}

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress
 Entries (RSS) and Comments (RSS)