计算4x4矩阵的行列式-(RayTracer挑战)-Javascript

问题描述 投票:1回答:1

我正在尝试用Javascript / Canvas编写raytracer,是根据“ Ray Tracer Challenge”(Jamis Buck)编写的。我编写的代码成功地计算了3x3矩阵的行列式,但是对于4x4矩阵却失败了,所以我删除了代码,而是将下面的代码从C代码转换而来。 (已编译的C版本有效。)即使它是从C移植的,它也没有为4x4输入矩阵提供正确的行列式。

我在做什么错?我想念什么?

((我在底部包括了原始的,有效的C代码。)

"use strict";
// HELPER FUNCTION

function initArray(rows, cols)  {

var result = [];

for (var r = 0; r < rows; r++)  {

    result[r] = [];

    for (var c = 0; c < cols; c++)  {

        result[r][c] = 0;
    }
}

return result;
}


//--------------------------------
// DETERMINANT

// Function to get cofactor of mat[p][q] in temp[][]. n is current 

// dimension of mat[][] 

function getCofactor(mat, p, q, n)
{

var temp = initArray(4,4);
var i = 0, j = 0; 

// Looping for each element of the matrix 
for (var row = 0; row < n; row++) 
{ 
    for (var col = 0; col < n; col++) 
    { 
        // Copying into temporary matrix only those element 
        // which are not in given row and column 
        if (row != p && col != q) 
        { 
            temp[i][j++] = mat[row][col];

            // Row is filled, so increase row index and 
            // reset col index 
            if (j == n - 1) 
            {
                j = 0; 
                i++; 
            }
        }
    } 
}

return temp;
}


/* Recursive function for finding determinant of matrix. 
n is current dimension of mat[][]. */

function determinantOfMatrix(mat, n) 
{ 

var D = 0; // Initialize result 

// Base case : if matrix contains single element 
if (n == 1) 
    return mat[0][0]; 

var temp = initArray(4, 4); // To store cofactors 

var sign = 1; // To store sign multiplier 

// Iterate for each element of first row 
for (var f = 0; f < n; f++) 
{ 
    // Getting Cofactor of mat[0][f] 
    temp = getCofactor(mat, 0, f, n); 
    D += sign * mat[0][f] * determinantOfMatrix(temp, n - 1); 

    // terms are to be added with alternate sign 
    sign = -sign; 
}

return D; 
} 

// Finally, this is how I test it:

function test7()    {

var m = initArray(4, 4);

m[0][0] = -2, m[0][1] = -8, m[0][2] = 3, m[0][3] = 5;
m[1][0] = -3, m[1][1] = 1, m[1][2] = 7, m[1][3] = 3;
m[2][0] = 1, m[2][1] = 2, m[2][2] = -9, m[2][3] = 6;
m[3][0] = 6, m[3][1] = 7, m[3][2] = 7, m[3][3] = -9;

/* 4x4 TEST MATRIX

    -2,    -8,    3,    5
    -3,     1,    7,    3
     1,     2,   -9,    6
     6,     7,    7,   -9

*/

var determinant = determinantOfMatrix(m, m.rows);

alert("determinant = " + determinant); // SHOULD BE -4071
}

// ----------------------下面是C代码,可用于--------

#include "<stdio.h"

// Dimension of input square matrix 

#define N 4 

// Function to get cofactor of mat[p][q] in temp[][]. n is current 
// dimension of mat[][] 

void getCofactor(int mat[N][N], int temp[N][N], int p, int q, int n) 
{ 

int i = 0, j = 0; 

// Looping for each element of the matrix 
for (int row = 0; row < n; row++) 
{ 
    for (int col = 0; col < n; col++) 
    { 
        // Copying into temporary matrix only those element 
        // which are not in given row and column 
        if (row != p && col != q) 
        { 
            temp[i][j++] = mat[row][col]; 

            // Row is filled, so increase row index and 
            // reset col index 
            if (j == n - 1) 
            { 
                j = 0; 
                i++; 
            }
        } 
    }
}
} 

/* Recursive function for finding determinant of matrix. 
n is current dimension of mat[][]. */

int determinantOfMatrix(int mat[N][N], int n) 
{ 

int D = 0; // Initialize result 

// Base case : if matrix contains single element 
if (n == 1) 
    return mat[0][0]; 

int temp[N][N]; // To store cofactors 

int sign = 1; // To store sign multiplier 

// Iterate for each element of first row 
for (int f = 0; f < n; f++) 
{ 
    // Getting Cofactor of mat[0][f] 
    getCofactor(mat, temp, 0, f, n); 
    D += sign * mat[0][f] * determinantOfMatrix(temp, n - 1); 

    // terms are to be added with alternate sign 
    sign = -sign; 
}

return D; 
} 


// Driver program to test above functions 

int main() 
{ 

int mat[N][N] = {{-2, -8, 3, 5}, 
                {-3, 1, 7, 3},
                {1, 2, -9, 6}, 
                {-6, 7, 7, -9} 
                }; 

printf("Determinant of the matrix is : %d", determinantOfMatrix(mat, N)); 
return 0; 
} 
javascript c matrix raytracing
1个回答
0
投票

有两个问题

1- Ry-♦指出,var determinant = determinantOfMatrix(m, m.rows);m.rows在这里未定义,请使用4 / N。

2-解决了第一个问题后,您的C实现实际上给出了错误的结果,但是javascript提供了正确的结果。正确的行列式是3933,但是您的C实现由于计算过程中的溢出而失败。

© www.soinside.com 2019 - 2024. All rights reserved.