Javascript 尝试在二维中点细分中描绘循环的逻辑
我理解这个概念,但在实现2D细分后的循环逻辑时遇到困难。我有一个2d数组,表示一个带有角点种子的网格。我想我需要3圈。1来循环细分迭代次数。第二个用于行中的每列,第三个用于每行 这就是我所拥有的。它显示左上角方形细分的结果。这就是为什么行和列只循环一次。如果我得到了基本的逻辑,剩下的应该是蛋糕。但是,循环在第三次迭代中不起作用。我很确定这个循环需要更加复杂 迭代是一个手动设置的变量Javascript 尝试在二维中点细分中描绘循环的逻辑,javascript,arrays,loops,logic,heightmap,Javascript,Arrays,Loops,Logic,Heightmap,我理解这个概念,但在实现2D细分后的循环逻辑时遇到困难。我有一个2d数组,表示一个带有角点种子的网格。我想我需要3圈。1来循环细分迭代次数。第二个用于行中的每列,第三个用于每行 这就是我所拥有的。它显示左上角方形细分的结果。这就是为什么行和列只循环一次。如果我得到了基本的逻辑,剩下的应该是蛋糕。但是,循环在第三次迭代中不起作用。我很确定这个循环需要更加复杂 迭代是一个手动设置的变量 // iterate though subdivision levels for(i
// iterate though subdivision levels
for(i = 1; i <= iterations; i++) { // iteration
// iterate through each row
for(row = 1; row <= 1; row += size / i ) { // row
// iterate through each column and subdivide
for(col = 1; col <= 1; col += size / i) { // column
//*** ONLY SHOWING THE FIRST SUBDIVIDE OF EACH ITERATION ***//
// Math.pow(2, iterations) / 2 / i = 1
// i = 1, iteration = 1
heightmap[0][1] = (heightmap[0][0] + heightmap[0][2]) / 2;
// Math.pow(2, iterations) / 2 / i = 2
// i = 1, iterations = 2
heightmap[0][2] = (heightmap[0][0] + heightmap[0][4]) / 2;
// Math.pow(2, iterations) / 2 / i = 4
// i = 1, iterations = 3
heightmap[0][4] = (heightmap[0][0] + heightmap[0][8]) / 2;
// if iterations == 1, i != 2
// Math.pow(2, iterations) / 2 / i = 1
// i = 2, iterations = 2
heightmap[0][1] = (heightmap[0][0] + heightmap[0][2]) / 2;
// Math.pow(2, iterations) / 2 / i = 2
// i = 2, iterations = 3
heightmap[0][2] = (heightmap[0][0] + heightmap[0][4]) / 2;
// if iterations == 1 or 2, i != 3
// Math.pow(2, iterations) / 2 / i = 4/3 != 1
// i = 3, iterations = 3
heightmap[0][1] = (heightmap[0][0] + heightmap[0][2]) / 2;
}
}
}
//迭代细分级别
对于(i=1;i而言,一次细分一个方向会更容易:
var points = [[ 0,-1,-1,-1, 1],
[-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1],
[ 2,-1,-1,-1, 0]];
var size = 4;
for (var iteration = 1; iteration < size; iteration *= 2) {
var step = size / iteration;
// * . * . *
// x . x . x
// * . * . *
for (var row = step / 2; row < size; row += step) {
for (var col = 0; col <= size; col += step) {
points[row][col] = ((points[row - step / 2][col] + points[row + step / 2][col]) / 2);
}
}
// * x * x *
// * x * x *
// * x * x *
for (var row = 0; row <= size; row += step / 2) {
for (var col = step / 2; col < size; col += step) {
points[row][col] = ((points[row][col - step / 2] + points[row][col + step / 2]) / 2);
}
}
}
var points = [[ 0,-1,-1,-1, 1],
[-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1],
[ 2,-1,-1,-1, 0]];
var size = 4;
for (var iteration = 1; iteration < size; iteration *= 2) {
var step = size / iteration;
// * . * . *
// x . x . x
// * . * . *
for (var row = step / 2; row < size; row += step) {
for (var col = 0; col <= size; col += step) {
points[row][col] = ((points[row - step / 2][col] + points[row + step / 2][col]) / 2);
}
}
// * x * x *
// * x * x *
// * x * x *
for (var row = 0; row <= size; row += step / 2) {
for (var col = step / 2; col < size; col += step) {
points[row][col] = ((points[row][col - step / 2] + points[row][col + step / 2]) / 2);
}
}
}
[[ 0, 0.25, 0.5, 0.75, 1 ],
[ 0.5, 0.5625, 0.625, 0.6875, 0.75 ],
[ 1, 0.875, 0.75, 0.625, 0.5 ],
[ 1.5, 1.1875, 0.875, 0.5625, 0.25 ],
[ 2, 1.5, 1, 0.5, 0 ]]