编辑(重述问题):
如何使用提供的smoothstep函数在相邻的2d数组之间创建渐变每个数组大小相同,包含0到1之间的值,通过单纯形噪声从边到边平滑过渡。因此,我希望在MaxMUMUM 0.04之间相邻数组值之间的差异。
function smoothstep (min, max, value) {
var x = Math.max(0, Math.min(1, (value-min)/(max-min)));
return x*x*(3 - 2*x);
};
我有6个二维数组,包含0到1之间的值来表示球体表面的高度要遍历数组的所有值,请执行以下操作:
for (var i = 0; i < cube.faces.length; i++) {
for (var x = 0; x < cube.faces[i].heightMap.length; x++) {
for (var z = 0; z < cube.faces[i].heightMap.length; z++) {
if (x == 0 || x == cube.faces[i].heightMap.length - 1 || z == 0 || z == cube.faces[i].heightMap.length - 1) {
switch (i) {
case 0:
if (x == 0) {
//match left of face 1 to top of face 4
} else if (z == 0) {
//match top of face 1 to top of face 6
} else if (z == cube.faces[i].heightMap.length - 1) {
//match bottom of face 1 to top of face 5
} else {
//match right of face 1 to top of face 3
}
break;
case 1:
if (x == 0) {
//match left of face 2 to bottom of face 3
} else if (z == 0) {
//match top of face 2 to bottom of face 6
} else if (z == cube.faces[i].heightMap.length - 1) {
//match bottom of face 2 to bottom of face 5
} else {
//match right of face 2 to bottom of face 4
}
break;
case 2:
if (x == 0) {
//match left of face 3 to right of face 5
} else if (z == 0) {
//~~match top of face 3 to right of face 1~~
} else if (z == cube.faces[i].heightMap.length - 1) {
//~~match bottom of face 3 to left of face 2~~
} else {
//match right of face 3 to left of face 6
}
break;
case 3:
if (x == 0) {
//match left of face 4 to right of face 6
} else if (z == 0) {
//~~match top of face 4 to left of face 1~~
} else if (z == cube.faces[i].heightMap.length - 1) {
//~~match bottom of face 4 to right of face 2~~
} else {
//match right of face 4 to left of face 5
}
break;
case 4:
break;
case 5:
break;
default:
break;
}
}
}
}
}
不过,我有一些困难,使面孔匹配。我发现了一个名为“smoothstep”的函数,它似乎正是我所需要的。我不知道如何实现它,我还没有找到一个对我有用的解释。
function smoothstep(min, max, value) {
var x = Math.max(0, Math.min(1, (value - min) / (max - min)));
return x * x * (3 - 2 * x);
};
下一页是我学习这种方法的地方,但我无法理解要说什么如果有人有时间的话,你能解释一下我是如何把这个应用到我的情况中的吗?Link to related question
最佳答案
回复:smoothstep,我在python的idle解释器中快速地重新创建了这个函数,这样我就可以将值插入其中并得到即时结果,而且尽可能接近我所知,它所做的只是将最小值拉伸到0,将最大值拉伸到1,然后相应地规范化值参数。
例如,如果提供的参数(0.2, 0.4, 0.3)
0.3介于0.2和0.4之间,则函数会将该值规格化为大约0.5
你只是想用与A边和B边相交的50个数组行/列创建一个数字的立体渐变吗?
如果是的话,我不知道smoothstep是不是一条路。
不管怎样,对于这样的事情,我会拿出一张纸,在中间画出一个数组id,然后标记边缘(假设下面的例子中是骰子脸模式):
|--A--|
D 3 B
|--C--|
|--A--|
D 1 B
|--C--|
|--A--| |--A--| |--A--|
D 2 B D 4 B D 5 B
|--C--| |--C--| |--C--|
|--A--|
D 6 B
|--C--|
然后在你的脑海中把它折叠起来(或者把它剪下来,然后把立方体物理地折叠起来),找到边对,然后画箭头,指示从边向内进入脸的方向(我喜欢用N(orth)、E(ast)、S(outh)、W(est)来想象从边缘往哪个方向走。
航向:
N = Same columnID, Start at max RowID and decrement (going north)
E = Same rowID, Start at min ColumnID and increment (going east)
S = Same columnID, Start at min RowID and increment (going south)
W = Same rowID, Start at max ColumnID and decrement (going west)
最后你会得到一个类似于
var list = [1,B,W,, 5,A,S,], [4,B,W,, 5,D,E,]...etc...]
的列表(额外的逗号是有意的,表示列表中的空白,请填写下一步)现在,这个列表被构建出来,你可以从每个数组中的任何方向抓取值,25行或列,将它插入空白空间中的列表中,你将得到绝对的最小值和最大值。例如
var list = [[1,B,W,0.3, 5,A,S,0.7],...etc...]
如果它是一个立体渐变,你只需要做一些简单的数学运算,然后根据它是最小值还是最大值,在适当的方向上,从每个边的起始值开始递增或递减。
如果它比二维数组边之间的直线渐变更复杂,我很抱歉,但可能需要更好的可视化效果。