意外噪音 – 梯度function

相关的我以前的问题( 二代Terra(里亚)在一代 – 意外的噪音 )我坚持了解梯度函数本身如何工作(在意外库)。

在聊天的帮助后(感谢乔恩!)我明白,定义的梯度,例如,梯度(0,0,0,1),它返回一个函数,轮到它将返回0和1之间的正确值为参数你提供。

所以用(0,40)调用这个函数会给你一个(0,1)之间的值。 但是,我不明白如果不知道外部的“范围”将如何做到这一点。

例如,如果您要呈现他的网站上显示的渐变图像: 意外的噪声梯度图像

你会通过定义渐变(0,0,0,1),然后为每个像素调用它吗? (0,1)(0,2),(50,50),…? 在这种情况下,像素(0,200)将不得不返回1,但是如果你有一个400像素高的图像,(0,200)将不得不返回0.5

用(0,0)和(0,1)之间的值以预定义的步骤(例如1/200或1/400)调用它似乎使梯度噪声函数本身没有用处。

如果可能的话,伪代码或python代码将非常受欢迎,以说明如何使梯度函数“内部”的工作,也许我想它太复杂。

提前致谢!

创建渐变时指定的值是您的端点。 因此,例如,当您使用值(x1 = 0,x2 = 0,y1 = 0,y2 = 1)创建渐变时,您将在y轴上创建一个渐变线,其终点为0和1, y轴。

好的,所以你的y轴上有一个渐变,从0点开始,一直到1点。这是什么意思?

如果位于或超过P1,则值被赋值为0.如果位于或超过P2,则该值被指定为1.任何之间的任何值都被指定为0和1之间的线性插值。

这并不意味着你的图像高1个像素,它只是意味着你的function梯度是1单位。

当你从这个函数获取值时,可以根据你的图像进行缩放。

例如:

for (int i = 0; i < imageWidth; i++) { for (int j = 0; j < imageHeight; j++) { double x = i / imageWidth; double y = j / imageHeight; double val = gradient.Get(x,y); } } 

你传递给函数的所有东西都应该根据你的世界的大小来缩放。 由于梯度位于函数的0和1之间,因此基本上只是根据最大世界高度对所有内容进行归一化处理。 为了说明,这里有一个小function,可以这样做:

 float gadientAt(worldX, worldY) return gradientFunction(worldX/WORLD_SIZE_X, worldY/WORLD_SIZE_Y) 

虽然您不必缩放x轴(因为渐变沿着y轴),但我们只是确保该函数适用于所有types的渐变。

如果您要传入0到1范围之外的值,则返回值只能为0或1。

您始终可以使用世界Gradient(0,0,worldMinY,WorldMaxY)的大小创建渐变函数,但人们通常喜欢用标准化的值来思考。