优化matrix
This commit is contained in:
@@ -2,218 +2,140 @@ module es {
|
||||
/**
|
||||
* 表示右手3 * 3的浮点矩阵,可以存储平移、缩放和旋转信息。
|
||||
*/
|
||||
export class Matrix2D {
|
||||
public m11: number = 0;
|
||||
public m12: number = 0;
|
||||
|
||||
public m21: number = 0;
|
||||
public m22: number = 0;
|
||||
|
||||
public m31: number = 0;
|
||||
public m32: number = 0;
|
||||
|
||||
private static _identity: Matrix2D = new Matrix2D(1, 0, 0, 1, 0, 0);
|
||||
|
||||
/**
|
||||
* 单位矩阵
|
||||
*/
|
||||
public static get identity(){
|
||||
return Matrix2D._identity;
|
||||
export class Matrix2D extends egret.Matrix{
|
||||
public get m11(): number{
|
||||
return this.a;
|
||||
}
|
||||
public set m11(value: number){
|
||||
this.a = value;
|
||||
}
|
||||
public get m12(): number{
|
||||
return this.b;
|
||||
}
|
||||
public set m12(value: number){
|
||||
this.b = value;
|
||||
}
|
||||
public get m21(): number{
|
||||
return this.c;
|
||||
}
|
||||
public set m21(value: number){
|
||||
this.c = value;
|
||||
}
|
||||
public get m22(): number{
|
||||
return this.d;
|
||||
}
|
||||
public set m22(value: number){
|
||||
this.d = value;
|
||||
}
|
||||
public get m31(): number {
|
||||
return this.tx;
|
||||
}
|
||||
public set m31(value: number){
|
||||
this.tx = value;
|
||||
}
|
||||
public get m32(): number{
|
||||
return this.ty;
|
||||
}
|
||||
public set m32(value: number){
|
||||
this.ty = value;
|
||||
}
|
||||
|
||||
constructor(m11?: number, m12?: number, m21?: number, m22?: number, m31?: number, m32?: number){
|
||||
this.m11 = m11 ? m11 : 1;
|
||||
this.m12 = m12 ? m12 : 0;
|
||||
|
||||
this.m21 = m21 ? m21 : 0;
|
||||
this.m22 = m22 ? m22 : 1;
|
||||
|
||||
this.m31 = m31 ? m31 : 0;
|
||||
this.m32 = m32 ? m32 : 0;
|
||||
public static create(): Matrix2D{
|
||||
return egret.Matrix.create() as Matrix2D;
|
||||
}
|
||||
|
||||
/** 存储在这个矩阵中的位置 */
|
||||
public get translation(){
|
||||
return new Vector2(this.m31, this.m32);
|
||||
public identity(): Matrix2D{
|
||||
super.identity();
|
||||
return this;
|
||||
}
|
||||
|
||||
public set translation(value: Vector2){
|
||||
this.m31 = value.x;
|
||||
this.m32 = value.y;
|
||||
public translate(dx: number, dy: number): Matrix2D {
|
||||
super.translate(dx, dy);
|
||||
return this;
|
||||
}
|
||||
|
||||
/** 以弧度表示的旋转存储在这个矩阵中 */
|
||||
public get rotation(){
|
||||
return Math.atan2(this.m21, this.m11);
|
||||
public scale(sx: number, sy: number): Matrix2D {
|
||||
super.scale(sx, sy);
|
||||
return this;
|
||||
}
|
||||
|
||||
public set rotation(value: number){
|
||||
let val1 = Math.cos(value);
|
||||
let val2 = Math.sin(value);
|
||||
|
||||
this.m11 = val1;
|
||||
this.m12 = val2;
|
||||
this.m21 = -val2;
|
||||
this.m22 = val1;
|
||||
public rotate(angle: number): Matrix2D {
|
||||
super.rotate(angle);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 以度为单位的旋转存储在这个矩阵中
|
||||
*/
|
||||
public get rotationDegrees(){
|
||||
return MathHelper.toDegrees(this.rotation);
|
||||
}
|
||||
|
||||
public set rotationDegrees(value: number){
|
||||
this.rotation = MathHelper.toRadians(value);
|
||||
}
|
||||
|
||||
public get scale(){
|
||||
return new Vector2(this.m11, this.m22);
|
||||
}
|
||||
|
||||
public set scale(value: Vector2){
|
||||
this.m11 = value.x;
|
||||
this.m12 = value.y;
|
||||
public invert(): Matrix2D {
|
||||
super.invert();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个新的matrix, 它包含两个矩阵的和。
|
||||
* @param matrix1
|
||||
* @param matrix2
|
||||
* @param matrix
|
||||
*/
|
||||
public static add(matrix1: Matrix2D, matrix2: Matrix2D){
|
||||
matrix1.m11 += matrix2.m11;
|
||||
matrix1.m12 += matrix2.m12;
|
||||
public add(matrix: Matrix2D): Matrix2D{
|
||||
this.m11 += matrix.m11;
|
||||
this.m12 += matrix.m12;
|
||||
|
||||
matrix1.m21 += matrix2.m21;
|
||||
matrix1.m22 += matrix2.m22;
|
||||
this.m21 += matrix.m21;
|
||||
this.m22 += matrix.m22;
|
||||
|
||||
matrix1.m31 += matrix2.m31;
|
||||
matrix1.m32 += matrix2.m32;
|
||||
this.m31 += matrix.m31;
|
||||
this.m32 += matrix.m32;
|
||||
|
||||
return matrix1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static divide(matrix1: Matrix2D, matrix2: Matrix2D){
|
||||
matrix1.m11 /= matrix2.m11;
|
||||
matrix1.m12 /= matrix2.m12;
|
||||
public substract(matrix: Matrix2D): Matrix2D {
|
||||
this.m11 -= matrix.m11;
|
||||
this.m12 -= matrix.m12;
|
||||
|
||||
matrix1.m21 /= matrix2.m21;
|
||||
matrix1.m22 /= matrix2.m22;
|
||||
this.m21 -= matrix.m21;
|
||||
this.m22 -= matrix.m22;
|
||||
|
||||
matrix1.m31 /= matrix2.m31;
|
||||
matrix1.m32 /= matrix2.m32;
|
||||
this.m31 -= matrix.m31;
|
||||
this.m32 -= matrix.m32;
|
||||
|
||||
return matrix1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static multiply(matrix1: Matrix2D, matrix2: Matrix2D){
|
||||
let result = new Matrix2D();
|
||||
public divide(matrix: Matrix2D): Matrix2D{
|
||||
this.m11 /= matrix.m11;
|
||||
this.m12 /= matrix.m12;
|
||||
|
||||
let m11 = ( matrix1.m11 * matrix2.m11 ) + ( matrix1.m12 * matrix2.m21 );
|
||||
let m12 = ( matrix1.m11 * matrix2.m12 ) + ( matrix1.m12 * matrix2.m22 );
|
||||
this.m21 /= matrix.m21;
|
||||
this.m22 /= matrix.m22;
|
||||
|
||||
let m21 = ( matrix1.m21 * matrix2.m11 ) + ( matrix1.m22 * matrix2.m21 );
|
||||
let m22 = ( matrix1.m21 * matrix2.m12 ) + ( matrix1.m22 * matrix2.m22 );
|
||||
this.m31 /= matrix.m31;
|
||||
this.m32 /= matrix.m32;
|
||||
|
||||
let m31 = ( matrix1.m31 * matrix2.m11 ) + ( matrix1.m32 * matrix2.m21 ) + matrix2.m31;
|
||||
let m32 = ( matrix1.m31 * matrix2.m12 ) + ( matrix1.m32 * matrix2.m22 ) + matrix2.m32;
|
||||
|
||||
result.m11 = m11;
|
||||
result.m12 = m12;
|
||||
|
||||
result.m21 = m21;
|
||||
result.m22 = m22;
|
||||
|
||||
result.m31 = m31;
|
||||
result.m32 = m32;
|
||||
|
||||
return result;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static multiplyTranslation(matrix: Matrix2D, x: number, y: number){
|
||||
let trans = Matrix2D.createTranslation(x, y);
|
||||
return Matrix2D.multiply(matrix, trans);
|
||||
public multiply(matrix: Matrix2D): Matrix2D{
|
||||
let m11 = ( this.m11 * matrix.m11 ) + ( this.m12 * matrix.m21 );
|
||||
let m12 = ( this.m11 * matrix.m12 ) + ( this.m12 * matrix.m22 );
|
||||
|
||||
let m21 = ( this.m21 * matrix.m11 ) + ( this.m22 * matrix.m21 );
|
||||
let m22 = ( this.m21 * matrix.m12 ) + ( this.m22 * matrix.m22 );
|
||||
|
||||
let m31 = ( this.m31 * matrix.m11 ) + ( this.m32 * matrix.m21 ) + matrix.m31;
|
||||
let m32 = ( this.m31 * matrix.m12 ) + ( this.m32 * matrix.m22 ) + matrix.m32;
|
||||
|
||||
this.m11 = m11;
|
||||
this.m12 = m12;
|
||||
|
||||
this.m21 = m21;
|
||||
this.m22 = m22;
|
||||
|
||||
this.m31 = m31;
|
||||
this.m32 = m32;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public determinant(){
|
||||
return this.m11 * this.m22 - this.m12 * this.m21;
|
||||
}
|
||||
|
||||
public static invert(matrix: Matrix2D, result: Matrix2D = new Matrix2D()){
|
||||
let det = 1 / matrix.determinant();
|
||||
|
||||
result.m11 = matrix.m22 * det;
|
||||
result.m12 = -matrix.m12 * det;
|
||||
|
||||
result.m21 = -matrix.m21 * det;
|
||||
result.m22 = matrix.m11 * det;
|
||||
|
||||
result.m31 = (matrix.m32 * matrix.m21 - matrix.m31 * matrix.m22) * det;
|
||||
result.m32 = -(matrix.m32 * matrix.m11 - matrix.m31 * matrix.m12) * det;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个新的tranlation
|
||||
* @param xPosition
|
||||
* @param yPosition
|
||||
*/
|
||||
public static createTranslation(xPosition: number, yPosition: number){
|
||||
let result = new Matrix2D();
|
||||
|
||||
result.m11 = 1;
|
||||
result.m12 = 0;
|
||||
|
||||
result.m21 = 0;
|
||||
result.m22 = 1;
|
||||
|
||||
result.m31 = xPosition;
|
||||
result.m32 = yPosition;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据position 创建一个translation
|
||||
* @param position
|
||||
*/
|
||||
public static createTranslationVector(position: Vector2){
|
||||
return this.createTranslation(position.x, position.y);
|
||||
}
|
||||
|
||||
public static createRotation(radians: number, result?: Matrix2D){
|
||||
result = new Matrix2D();
|
||||
|
||||
let val1 = Math.cos(radians);
|
||||
let val2 = Math.sin(radians);
|
||||
|
||||
result.m11 = val1;
|
||||
result.m12 = val2;
|
||||
result.m21 = -val2;
|
||||
result.m22 = val1;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static createScale(xScale: number, yScale: number, result: Matrix2D = new Matrix2D()){
|
||||
result.m11 = xScale;
|
||||
result.m12 = 0;
|
||||
|
||||
result.m21 = 0;
|
||||
result.m22 = yScale;
|
||||
|
||||
result.m31 = 0;
|
||||
result.m32 = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public toEgretMatrix(): egret.Matrix{
|
||||
let matrix = new egret.Matrix(this.m11, this.m12, this.m21, this.m22, this.m31, this.m32);
|
||||
return matrix;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,46 @@ module es {
|
||||
this.y = y ? y : this.x;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
public add(value: Vector2): Vector2{
|
||||
this.x += value.x;
|
||||
this.y += value.y;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
public divide(value: Vector2): Vector2{
|
||||
this.x /= value.x;
|
||||
this.y /= value.y;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
public multiply(value: Vector2): Vector2{
|
||||
this.x *= value.x;
|
||||
this.y *= value.y;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
*/
|
||||
public subtract(value: Vector2){
|
||||
this.x -= value.x;
|
||||
this.y -= value.y;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value1
|
||||
|
||||
Reference in New Issue
Block a user