Webgl可视化常规矩阵JS代码_好的兆头的博客-CSDN博客_数值矩阵的元素值可视化显示 js

1. 4*4 矩阵的行列式:

function determinant(out, a) {
    let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
    let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
    let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
    let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];

    let b00 = a00 a11 - a01 a10;
    let b01 = a00 a12 - a02 a10;
    let b02 = a00 a13 - a03 a10;
    let b03 = a01 a12 - a02 a11;
    let b04 = a01 a13 - a03 a11;
    let b05 = a02 a13 - a03 a12;
    let b06 = a20 a31 - a21 a30;
    let b07 = a20 a32 - a22 a30;
    let b08 = a20 a33 - a23 a30;
    let b09 = a21 a32 - a22 a31;
    let b10 = a21 a33 - a23 a31;
    let b11 = a22 a33 - a23 a32;
    return b00 b11 - b01 b10 + b02 b09 + b03 b08 - b04 b07 + b05 b06;
}

2. 4*4 矩阵乘法:

// 在webgl中,行列倒置并且按列展开,因此跟平常的数学公式不同

// AT 乘 BT = (B乘A)T

function multipli(out, {a, arow, acol}, {b, brow, bcol}) {
    if (acol != brow) {
        return null;
    }
    for(var i = 0; i < arow; ++i) {
        for(var j = 0; j < bcol; ++j) {
            out[i*bcol+j] = 0;
            for(var k = 0; k < brow; ++k) {
                out[i*bcol+j] = out[i*bcol+j] + b[j*bcol + k] * a[k*acol+i] ;
            }
        }
    }
    return {out, arow, bcol};
}

3. 4*4矩阵的伴随矩阵

function adjoint(out, a) {
    let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
    let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
    let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
    let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];

    let b00 = a00 a11 - a01 a10;
    let b01 = a00 a12 - a02 a10;
    let b02 = a00 a13 - a03 a10;
    let b03 = a01 a12 - a02 a11;
    let b04 = a01 a13 - a03 a11;
    let b05 = a02 a13 - a03 a12;
    let b06 = a20 a31 - a21 a30;
    let b07 = a20 a32 - a22 a30;
    let b08 = a20 a33 - a23 a30;
    let b09 = a21 a32 - a22 a31;
    let b10 = a21 a33 - a23 a31;
    let b11 = a22 a33 - a23 a32;

    out[0] = (a11 b11 - a12 b10 + a13 * b09);
    out[1] = (a02 b10 - a01 b11 - a03 * b09);
    out[2] = (a31 b05 - a32 b04 + a33 * b03);
    out[3] = (a22 b04 - a21 b05 - a23 * b03);
    out[4] = (a12 b08 - a10 b11 - a13 * b07);
    out[5] = (a00 b11 - a02 b08 + a03 * b07);
    out[6] = (a32 b02 - a30 b05 - a33 * b01);
    out[7] = (a20 b05 - a22 b02 + a23 * b01);
    out[8] = (a10 b10 - a11 b08 + a13 * b06);
    out[9] = (a01 b08 - a00 b10 - a03 * b06);
    out[10] = (a30 b04 - a31 b02 + a33 * b00);
    out[11] = (a21 b02 - a20 b04 - a23 * b00);
    out[12] = (a11 b07 - a10 b09 - a12 * b06);
    out[13] = (a00 b09 - a01 b07 + a02 * b06);
    out[14] = (a31 b01 - a30 b03 - a32 * b00);
    out[15] = (a20 b03 - a21 b01 + a22 * b00);
    return out;
}

4. 4*4矩阵的逆矩阵

// 即A的伴随矩阵除以A的行列式
function inverse(out, a) {
    let a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
    let a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
    let a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
    let a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];

    let b00 = a00 a11 - a01 a10;
    let b01 = a00 a12 - a02 a10;
    let b02 = a00 a13 - a03 a10;
    let b03 = a01 a12 - a02 a11;
    let b04 = a01 a13 - a03 a11;
    let b05 = a02 a13 - a03 a12;
    let b06 = a20 a31 - a21 a30;
    let b07 = a20 a32 - a22 a30;
    let b08 = a20 a33 - a23 a30;
    let b09 = a21 a32 - a22 a31;
    let b10 = a21 a33 - a23 a31;
    let b11 = a22 a33 - a23 a32;

    // 计算行列式
    let det = b00 b11 - b01 b10 + b02 b09 + b03 b08 - b04 b07 + b05 b06;

    if (Math.abs(det) > 0.00001) {
        det = 1.0 / det;
    }
    out[0] = (a11 b11 - a12 b10 + a13 b09) det;
    out[1] = (a02 b10 - a01 b11 - a03 b09) det;
    out[2] = (a31 b05 - a32 b04 + a33 b03) det;
    out[3] = (a22 b04 - a21 b05 - a23 b03) det;
    out[4] = (a12 b08 - a10 b11 - a13 b07) det;
    out[5] = (a00 b11 - a02 b08 + a03 b07) det;
    out[6] = (a32 b02 - a30 b05 - a33 b01) det;
    out[7] = (a20 b05 - a22 b02 + a23 b01) det;
    out[8] = (a10 b10 - a11 b08 + a13 b06) det;
    out[9] = (a01 b08 - a00 b10 - a03 b06) det;
    out[10] = (a30 b04 - a31 b02 + a33 b00) det;
    out[11] = (a21 b02 - a20 b04 - a23 b00) det;
    out[12] = (a11 b07 - a10 b09 - a12 b06) det;
    out[13] = (a00 b09 - a01 b07 + a02 b06) det;
    out[14] = (a31 b01 - a30 b03 - a32 b00) det;
    out[15] = (a20 b03 - a21 b01 + a22 b00) det;
    return out;
}

5. 4*4矩阵的转置矩阵

function transport(out, a) {
    //out[0] = a[0];
    //out[1] = a[4];
    //out[2] = a[8];
    //out[3] = a[12];
    //out[4] = a[1];
    //out[5] = a[5];
    //out[6] = a[9];
    //out[7] = a[13];
    //out[8] = a[2];
    //out[9] = a[6];
    //out[10] = a[10];
    //out[11] = a[14];
    //out[12] = a[3];
    //out[13] = a[7];
    //out[14] = a[11];
    //out[15] = a[15];
    for (let i = 0; i < 4; ++i) {
        for (let j = 0; j < 4; ++j) {
            out[i*4+j] = a[j*4+i];
        }
    }
    return out;
}

6. 平移矩阵

[
    1,0,0,0,
    0,1,0,0,
    0,0,1,0,
    x,y,z,1
]

其中,x,y,z分别是x轴,y轴,z轴方向上的平移量,值范围是[-1,1]

7. 旋转矩阵

绕x轴旋转radx弧度,对应矩阵:
[
    1,0,0,0,
    0,cos(radx),sin(radx),0,
    0,-sin(radx),cos(radx),0,
    0,0,0,1
]

绕y轴旋转rady弧度,对应矩阵:
[
    cos(rady),0,sin(rady),0,
    0,1,0,0,
    -sin(rady),0,cos(rady),0,
    0,0,0,1
]

绕z轴旋转radz弧度,对应矩阵:
[
    cos(radz),sin(radz),0,0,
    -sin(radz),cos(radz),0,0,
    0,0,1,0,
    0,0,0,1
]

8. 缩放矩阵

[
    scalex,0,0,0,
    0,scaley,0,0,
    0,0,scalez,0,
    0,0,0,1
]


原网址: 访问
创建于: 2023-01-12 16:36:17
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论