2016-04-21 1 views
2

Je suis en train de créer une matrice 3d en javascript, et je veux mettre à jour ses valeurs en utilisant ses coordonnées:matrice 3D avec les coordonnées en javascript

var xAxis = []; 
var yAxis = []; 
var ZAxis = []; 
var dimensions = 4; 

//initalize matrix 

for (var i=0;i<dimensions;i++){ 
    xAxis.push(0); 
} 
for (var j=0;j<dimensions;j++){ 
    yAxis.push(xAxis); 
} 
for (var k=0;k<dimensions;k++){ 
    matrix.push(yAxis); 
} 

//check value of one point in the matrix 
matrix[1][2][3]; //returns 0 as expected 
//update value of matrix using same coordinates 
matrix[1][2][3] = 2; 

Quand je lance la dernière étape, il non seulement mettre à jour mon prévu 1 [2] [3] coordonne, mais il met également à jour chaque troisième valeur de chaque tableau à 2 comme vous le verrez dans l'image: enter image description here

Comment puis-je gérer la mise à jour seule la valeur ce que je veux?? Je veux dire, le nombre 2 ne devrait être que dans un point de coordonnées, dans ce cas 1 [2] [3].

Note: Je pense que ça a quelque chose à faire, il pourrait être assignant les tableaux originaux dans la matrice au lieu de nouvelles copies d'eux-mêmes, alors quand je mets à jour une coordonnée, je suis réellement mettre à jour le tableau original, et les autres tableaux ne font que pointer sur l'original, alors c'est pour ça que ça se reflète là aussi?

+1

Les tableaux sont passés par référence. Ensuite, si vous modifiez un tableau, vous modifiez les autres. – wawawoom

+0

J'ai changé 'yAxis.push (xAxis);' à 'yAxis.push (xAxis.slice (0));' et il semble changer le comportement, mais je pense que je dois faire quelque chose avec le 0 (zéro) J'assigne au début et continue de mettre à jour les autres tableaux. savez-vous comment puis-je y parvenir? Merci! – randomguy04

Répondre

2

Vous poussez des ensembles par référence.

la création de votre matrice Tenir compte de cette façon:

var matrix = [0, 1, 2, 3].map(function() { 
    return new Array(4).fill().map(function(){ 
     return new Array(4).fill(0); 
    }); 
}); 
+0

ça marche des merveilles! mais que faire si la dimension doit être transmise dynamiquement? Je ne comprends pas très bien la fonction, même si je l'ai testé et il fait exactement ce que je veux et j'attends. à votre santé! – randomguy04

0

Vous n'êtes pas en train de créer des copies si votre tableau, mais passer des références.

Vous pouvez utiliser une fonction pour créer n dim matrices

var createMatrix = function(dimensions, level) { 
    if (level === undefined) { 
    level = dimensions - 1 
    } 
    var arr = []; 
    for (var j = 0; j < dimensions; j++){ 
     arr[j] = level === 0 ? 0 : createMatrix(dimensions, level-1) 
    } 
    } 
    return arr 
} 

var matrix = createMatrix(3) 

https://tonicdev.com/lipp/matrix

+0

Merci! façon intelligente de créer une matrice de n dimensions, je pense que vous m'avez fait réaliser que je n'utilisais pas correctement les dimensions du mot, comme c'est une matrice 3d, mais l'axe XYZ a la même longueur, mais il sera toujours XYZ. Je vous remercie! – randomguy04