0

我看了一些教程并尝试在 python 中创建一个 Perlin 噪声生成器。它采用一个元组来表示 x 和 y 方向上的向量数量以及阵列之间的距离(以像素为单位),然后计算每个像素与其周围的 4 个阵列中的每一个之间的点积,然后对它们进行双线性插值获取像素的值。

这是代码:

from PIL import Image
import numpy as np

scale = 16
size = np.array([8, 8])
vectors = []

for i in range(size[0]):
    for j in range(size[1]):
        rand = np.random.rand() * 2 * np.pi
        vectors.append(np.array([np.cos(rand), np.sin(rand)]))

interpolated_map = np.zeros(size * scale)

def interpolate(x1, x2, w):
    t = (w % scale) / scale
    return (x2 - x1) * t + x1

def dot_product(a, b):
    return a[0] * b[0] + a[1] * b[1]

for i in range(size[1] * scale):
    for j in range(size[0] * scale):
        dot_products = []
        for m in range(4):
            corner_vector_x = round(i / scale) + (m % 2)
            corner_vector_y = round(j / scale) + int(m / 2)
            x = i - corner_vector_x * scale
            y = j - corner_vector_y * scale
            if corner_vector_x >= size[0]:
                corner_vector_x = 0
            if corner_vector_y >= size[1]:
                corner_vector_y = 0
            corner_vector = vectors[corner_vector_x + corner_vector_y * (size[0])]
            distance_vector = np.array([x, y])
            dot_products.append(dot_product(corner_vector, distance_vector))
        x1 = interpolate(dot_products[0], dot_products[1], i)
        x2 = interpolate(dot_products[2], dot_products[3], i)
        interpolated_map[i][j] = (interpolate(x1, x2, j) / 2 + 1) * 255

img = Image.fromarray(interpolated_map)

img.show()

我得到这张图片: 在此处输入图像描述

但我应该得到这个: 在此处输入图像描述

我不知道出了什么问题,我试过看多个不同的教程,阅读一堆不同的文章,但结果总是一样的。

4

0 回答 0