在 JavaScript 中创建 N 维点网格
Create N dimensional grid of points in JavaScript
我知道那里有类似的问题(我找到的最接近的问题是这个 JavaScript; n-dimensional array creation),但大多数问题都在 Python 中,甚至我发现我试图在我的代码,但没有用。
所以我想创建一个函数 createGrid(L,n)
,它将两个大小相同的数组 L 和 n 作为参数。其中,L[i] 将指定维度 i 中的网格大小,n[i] 将指定同一维度中的点数(例如点之间的间距为 L[i]/(n[i] - 1). 例如,对于二维,假设我调用“let grid = createGrid([10,10],[2,2])
”,那么函数应该 return 一个 n+1 维数组,如下所示:
[[[0,0],[0,10]], [[10,0], [10,10]].
所以如果我想访问网格中的一个点,我可以简单地键入,例如,grid[1][0],这将 return 点 [10,0].
此时此刻,我正在对 3 个维度进行硬编码,如下所示:
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;
}
但我想将其扩展任意数量的维度。我尝试按照我一开始链接的问题所示进行递归,但它根本不起作用,所以我稍微调整了一下,事情变得更糟,从那时起,我开始变得越来越困惑。
如果可以,请帮忙!非常感谢!
您可以使用循环。这是解决这个问题的好方法。
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
}
我知道那里有类似的问题(我找到的最接近的问题是这个 JavaScript; n-dimensional array creation),但大多数问题都在 Python 中,甚至我发现我试图在我的代码,但没有用。
所以我想创建一个函数 createGrid(L,n)
,它将两个大小相同的数组 L 和 n 作为参数。其中,L[i] 将指定维度 i 中的网格大小,n[i] 将指定同一维度中的点数(例如点之间的间距为 L[i]/(n[i] - 1). 例如,对于二维,假设我调用“let grid = createGrid([10,10],[2,2])
”,那么函数应该 return 一个 n+1 维数组,如下所示:
[[[0,0],[0,10]], [[10,0], [10,10]].
所以如果我想访问网格中的一个点,我可以简单地键入,例如,grid[1][0],这将 return 点 [10,0].
此时此刻,我正在对 3 个维度进行硬编码,如下所示:
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;
}
但我想将其扩展任意数量的维度。我尝试按照我一开始链接的问题所示进行递归,但它根本不起作用,所以我稍微调整了一下,事情变得更糟,从那时起,我开始变得越来越困惑。 如果可以,请帮忙!非常感谢!
您可以使用循环。这是解决这个问题的好方法。
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
}