这是一个分析解决方案,它不依赖于保留数据,并且是连续的。按照这里描述的方法,我生成了一个柏林噪声值的直方图,然后通过对直方图求和来近似连续分布函数,所以cdf(x)
cdf(x) = sum(histogram[i] for all i < x)
然后我用 Wolfram Alphacdf(x)
用五次多项式逼近。这给了我这个功能:
function F(x) { return (((((0.745671 * x + 0.00309887) * x - 1.53841) * x - 0.00343488) * x + 1.29551) * x) + 0.500516;
x^5+0.00309887 x^4-1.53841 x^3-0.00343488 x^2+1.29551 x+0.500516 u = (u + 0.002591009999999949) / 1.0055419999999997; // 交叉 (0,0) 和 (1,1)
F(x) = 0.745671 x^5 + 0.00309887 x^4 - 1.53841 x^3 - 0.00343488 x^2 + 1.29551 x + 0.500516
现在F(perlin.noise2(...))
相当接近均匀分布。
此函数并没有完全通过点(-1,0)
,(1,1)
因此您可以将其更正为
F1(x) = (F(x) + 0.002591009999999949) / 1.0055419999999997
该函数也偏离 1 nearx = 1
和 0 near 之下x = -1
,因此如果这对您很重要,您应该将其限制在 0 和 1 之间。
F2(x) = max(min(F1(x), 1), 0)
(除非出现想要更多细节的人,否则我将保持简洁。如果是这样,请发表评论。)