/** * returns the inverse of transformation matrix * @readonly * @type {GLM.IArray} */ public get InverseTransform(): GLM.IArray { if (this.mInverseTransVersion !== this.mVersion) { mat3.invert(this.mCachedInverse, this.mTransformation); this.mInverseTransVersion = this.mVersion; } //TODO should reset mIsTransformationDirty to false, maybe should also call an abstract function so children of this class can do some recalculations as well return this.mCachedInverse; }
outMat2d = mat2d.sub(outMat2d, mat2dA, mat2dB); outMat2d = mat2d.multiplyScalar (outMat2d, mat2dA, 2); outMat2d = mat2d.multiplyScalarAndAdd (outMat2d, mat2dA, mat2dB, 2); outBool = mat2d.exactEquals(mat2dA, mat2dB); outBool = mat2d.equals(mat2dA, mat2dB); // mat3 outMat3 = mat3.create(); outMat3 = mat3.fromMat4(outMat3, mat4A); outMat3 = mat3.clone(mat3A); outMat3 = mat3.copy(outMat3, mat3A); outMat3 = mat3.fromValues(1, 2, 3, 4, 5, 6, 7, 8, 9); outMat3 = mat3.set(outMat3, 1, 2, 3, 4, 5, 6, 7, 8, 9); outMat3 = mat3.identity(outMat3); outMat3 = mat3.transpose(outMat3, mat3A); outMat3Null = mat3.invert(outMat3, mat3A); outMat3 = mat3.adjoint(outMat3, mat3A); outVal = mat3.determinant(mat3A); outMat3 = mat3.multiply(outMat3, mat3A, mat3B); outMat3 = mat3.mul(outMat3, mat3A, mat3B); outMat3 = mat3.translate(outMat3, mat3A, vec3A); outMat3 = mat3.rotate(outMat3, mat3A, Math.PI/2); outMat3 = mat3.scale(outMat3, mat3A, vec2A); outMat3 = mat3.fromTranslation(outMat3, vec2A); outMat3 = mat3.fromRotation(outMat3, Math.PI); outMat3 = mat3.fromScaling(outMat3, vec2A); outMat3 = mat3.fromMat2d(outMat3, mat2dA); outMat3 = mat3.fromQuat(outMat3, quatA); outMat3Null = mat3.normalFromMat4(outMat3, mat4A); outStr = mat3.str(mat3A); outVal = mat3.frob(mat3A);
outMat2d = mat2d.sub(outMat2d, mat2dA, mat2dB); outMat2d = mat2d.multiplyScalar (outMat2d, mat2dA, 2); outMat2d = mat2d.multiplyScalarAndAdd (outMat2d, mat2dA, mat2dB, 2); outBool = mat2d.exactEquals(mat2dA, mat2dB); outBool = mat2d.equals(mat2dA, mat2dB); // mat3 outMat3 = mat3.create(); outMat3 = mat3.fromMat4(outMat3, mat4A); outMat3 = mat3.clone(mat3A); outMat3 = mat3.copy(outMat3, mat3A); outMat3 = mat3.fromValues(1, 2, 3, 4, 5, 6, 7, 8, 9); outMat3 = mat3.set(outMat3, 1, 2, 3, 4, 5, 6, 7, 8, 9); outMat3 = mat3.identity(outMat3); outMat3 = mat3.transpose(outMat3, mat3A); outMat3 = mat3.invert(outMat3, mat3A); outMat3 = mat3.adjoint(outMat3, mat3A); outVal = mat3.determinant(mat3A); outMat3 = mat3.multiply(outMat3, mat3A, mat3B); outMat3 = mat3.mul(outMat3, mat3A, mat3B); outMat3 = mat3.translate(outMat3, mat3A, vec3A); outMat3 = mat3.rotate(outMat3, mat3A, Math.PI/2); outMat3 = mat3.scale(outMat3, mat3A, vec2A); outMat3 = mat3.fromTranslation(outMat3, vec2A); outMat3 = mat3.fromRotation(outMat3, Math.PI); outMat3 = mat3.fromScaling(outMat3, vec2A); outMat3 = mat3.fromMat2d(outMat3, mat2dA); outMat3 = mat3.fromQuat(outMat3, quatA); outMat3 = mat3.normalFromMat4(outMat3, mat4A); outStr = mat3.str(mat3A); outVal = mat3.frob(mat3A);
transformMapToSquare(...pos : [MapPos, SquarePos][]){ if(pos.length === 0) return; if(pos.length === 1){ /* squareToMap * squarePos = mapPos [ s 0 x ] [s_x] [m_x] [ 0 s y ] x [s_y] = [m_y] [ 0 0 1 ] [ 1 ] [ 1 ] m_x = s*s_x + x m_y = s*s_y + y x = m_x - s*s_x y = m_y - s*s_y 1 > x > -1 1 > y > -1 */ const s = this.squareToMapMatrix[0] //reuse existing scale const x = pos[0][0][0] - s*pos[0][1][0]; const y = pos[0][0][1] - s*pos[0][1][1]; mat2d.set(this.squareToMapMatrix, s, 0, 0, s, minmax(-1, x, 1), minmax(-1, y, 1)); mat2d.invert(this.squareFromMapMatrix, this.squareToMapMatrix); this.recalculate(); return; } /* Calculate squareToMap by solving the equation mapPos = squareToMap * squarePos [ s 0 x ] [s_x_a s_x_b s_x_c] [m_x_a m_x_b m_x_c] [ 0 s y ] x [s_y_a s_y_b s_y_c] = [m_y_a m_y_b m_y_c] [ 0 0 1 ] [ 1 1 1] [ 1 1 1] s*s_x_a + x = m_x_a s*s_x_b + x = m_x_b s*s_x_c + x = m_x_c s*s_y_a + y = m_y_a s*s_y_b + y = m_y_b s*s_y_c + y = m_y_c [ s_x_a 1 0 ] [ s ] [ m_x_a ] [ s_x_b 1 0 ] [ x ] = [ m_x_b ] [ s_x_c 1 0 ] [ y ] [ m_x_c ] [ s_y_a 0 1 ] [ m_y_a ] [ s_y_b 0 1 ] [ m_y_b ] [ s_y_c 0 1 ] [ m_y_c ] (At*A)i*At*b Ai*Ati*At*b Ai*b [L*3][3] = [L] [3*L][L*3][3] = [3*L][L] [3*3][3] = [3] */ const len = pos.length; let m00=0, m01=0, m02=0, m11=0,m12=0,m22=0; let v0=0, v1=0, v2=0; for(let i=0; i<len; i++){ m00 += pos[i][1][0]*pos[i][1][0] + pos[i][1][1]*pos[i][1][1]; m01 += pos[i][1][0]; m02 += pos[i][1][1]; v0 += pos[i][0][0]*pos[i][1][0] + pos[i][0][1]*pos[i][1][1]; v1 += pos[i][0][0]; v2 += pos[i][0][1]; } const mat = mat3.fromValues( m00, m01, m02, m01, len, 0, m02, 0, len); const vec = vec3.fromValues(v0, v1, v2); mat3.invert(mat, mat); vec3.transformMat3(vec, vec, mat); const s = minmax(0.001, vec[0], 2); mat2d.set(this.squareToMapMatrix, s, 0, 0, s, minmax(-1, vec[1], 1), minmax(-1, vec[2], 1)); mat2d.invert(this.squareFromMapMatrix, this.squareToMapMatrix); this.recalculate(); }