1

I know there are similar questions out there (the closest one I found was this JavaScript; n-dimensional array creation) but most one them are in Python and even this one I found I tried to implement in my code and It didn't work.

So I want to create a function createGrid(L,n) that take as parameters two arrays of same size, L and n. In these, L[i] would specify the size of the grid in dimension i and n[i] would specify the number of points in the same dimension (such as the spacing between points is L[i]/(n[i] - 1). For example, for two dimensions lets say I call "let grid = createGrid([10,10],[2,2])" then the function should return an n+1 dimension array like this: [[[0,0],[0,10]], [[10,0], [10,10]].

So If I want to access a point in the grid I could simply type, for example, grid[1][0], which will return the point [10,0].

In this moment I am hardcoding this for 3 dimensions like this:

let create3DSquareGrid = function(L, n){
    //L should be an array [Lx, Ly, Lz], if not they are all the same
    if(!Array.isArray(L)){
        L = [L,L,L];
    }
    //n should be an array [nx, ny, nz], if not they are all the same
    if(!Array.isArray(n)){
        n = [n,n,n];
    }
    //calculate the dl of each dimension
    var dl = L.map((val,i)=> Math.round(val/(n[i]-1)));
    
    //create the grid
    let grid = []
    for(let i=0; i<n[0]; i++){
        let x = i*dl[0];
        let gridJ = [];
        for(let j=0; j<n[1]; j++){
            let y = j*dl[1];
            let gridK = [];
            for(let k=0; k<n[2]; k++){
                let z = k*dl[2];
                gridK.push([x,y,z]);
            }
            gridJ.push(gridK)
        }
        grid.push(gridJ);
    }
    return grid;
}

But I want to extend this by any number of dimensions. I tried to recurse as shown at the question I linked in the beginning but it simply did not work, so I tweaked it a little bit and things got worse, I from that point I just started getting more and more confused. If you can, please help! And thanks a lot!

1 Answer 1

1

You can use a loop. It is a great way to solve this problem.

function createGrid(L, n) {
    var ans = L
    for (i = 1; i < L.length; i++) {
        var tmp = []
        for (el of ans) {
            innerTmp = []
            for (j = 0; j < L.length; j++) {
                innerTmp.push([el, L[j]])
            }
            tmp.push(innerTmp)
        }
        ans = tmp
    }
    return ans
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.