def direct(rect, usernumber, userquantity, coordinate, dimension, seed):#наложить шум на прямоугольный кластер
    n = noise(usernumber, userquantity, coordinate, dimension, seed)
    n *= SCALE
    if (n == 0.0):
        return rect
    if (n > 0.0):
        n = math.floor(n)
    else:
        n = math.ceil(n)
    (width, height) = rect.size#размеры кластера
    pix = rect.load()#массив пикселей кластера
    draw = ImageDraw.Draw(rect)
    for i in range(width):#проход по всем пикселям кластера
        for j in range(height):
            (r, g, b) = pix[i, j]
            r += n; g += n; b += n
            if (r > 255):
                r = 255
            elif (r < 0):
                r = 0
            if (g > 255):
                g = 255
            elif (g < 0):
                g = 0
            if (b > 255):
                b = 255
            elif (b < 0):
                b = 0
            draw.point((i, j), (r, g, b))
    return rect
(width, height) = original.size
c_width = width // cluster_w
c_height = height // cluster_h

pix = original.load()

max_seed = os.system('getMaxSignedInt') * 2 - 1#тот же seed, который использовался при наложении шума
seed = 0
for i in range(width):
    for j in range(height):
        (a, b, c) = pix[i, j]
        seed += math.ceil((math.sin(a + b + c)**2)*(a + b + c))
seed = seed % max_seed

noise_list = []#получившийся в нелегальной копии вектор шума
for j_c in range(c_height):
    for i_c in range(c_width):
        rect = (cluster_w * i_c, cluster_h * j_c, cluster_w * (i_c + 1), cluster_h * (j_c + 1))
        noise_list.append(diff(original.crop(rect), copy.crop(rect)))

scalar_prod = []#скалярное произведение вектора шума с базисными векторами шума
for i in range(userquantity):
    summ = 0.0
    for j in range(c_width * c_height):
        summ += noise_list[j] * noise(i, userquantity, j, c_width * c_height, seed)
    scalar_prod.append(summ)

print(scalar_prod)#компоненты в ортогональном базисе 
input()