Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Шум Перлина для самых маленьких
СообщениеДобавлено: 31 май 2017, 15:58 
Не в сети
Одарённый
Зарегистрирован:
30 авг 2012, 17:55
Сообщений: 105
Cпасибо сказано: 20
Спасибо получено:
0 раз в 0 сообщении
Очков репутации: 2

Добавить очки репутацииУменьшить очки репутации
Привки. Хочу разобраться, как строить шум Перлина, но не могу.
В инете надыбал вот такую инфу http://eastfarthing.com/blog/2015-04-21-noise/, но не могу понять эту часть
Цитата:
So given this, we can just focus on the direction of G and always use unit length vectors. If we clamp the product of the falloff kernel and the gradient to 0 at all points beyond the 2×2 square, this gives us the surflet mentioned in that cryptic sentence.


Кратко поясню суть того, что происходило до этого момент.

Вот есть у нас квадрат с пикселями, мы берем значение с -1 до 1, где -1 - левый край квадратика, а 1 - правый край. После чего мы сглаживаем этот градиент и инвертируем, и получаем сглаженный градиент, который начинается слева со значением 0, по серединке поднимается к 1, а потом снова спадает в ноль.
После чего мы делаем все то же самое, но уже сверху вниз, и умножаем на то, что получили ранее. И тут у нас получается вот такая вот картинка
https://gyazo.com/e73a506b8c1b80ee19293c0cf5d95d38

После этого мы берем какой-то рандомный одиничный вектор, который указывает в какую-то сторону, и умножаем то, что у нас уже есть, на скалярное произведение одиничного вектора и первоначальных значений (которые идут от -1 до 1).
Т.е. если наш одиничный вектор равен (0.7, 0.7), то мы будем умножать тот кружочек на (0.7*x + 0.7*y) где x и y изменяются от -1 до 1.
После этого надо нормализовать значение таким образом, что 0 будет серым цветом, а 1 белым, а все остальное черным, и получим вот такую картинку.
https://gyazo.com/236dab95d06552f1229eccb8f5011687
Вот тут одиничный вектор показывает куда-то вправо и вверх

Внимание, вопрос!

Че делать дальше, чтобы получить шум Перлина?

Я вот думал, мб, если рисовать кучку таких штучек, и в каждой штучке будет какой-то свой одиничный вектор, то оно натолкнет на мысль, но не натолкнуло.
https://gyazo.com/a8e1689aea5730705f5d51d7ba93ef3f

Код на Python

import sys
import random
import math
from PyQt4.QtGui import *
from PyQt4.QtCore import pyqtSlot

class Example(QWidget):

def __init__(self):
super(Example, self).__init__()
self.gx=1
self.gy=0
self.lbl=QLabel()
self.tlb = None
self.image = QImage(512, 512, QImage.Format_RGB32)
self.hbox = QHBoxLayout()
self.pixmap = QPixmap()
self.length = 1
self.initUI()

def mousePressEvent(self, QMouseEvent):
px = QMouseEvent.pos().x()
py = QMouseEvent.pos().y()

size = self.frameSize()

self.gx = px-size.width()/2
self.gy = py-size.height()/2

h = (self.gx**2+self.gy**2)**0.5

self.gx/=h
self.gy/=h

self.fillImage()

def wheelEvent(self,event):
self.length+=(event.delta()*0.001)
print(self.length)


def initUI(self):
self.hbox = QHBoxLayout(self)
self.pixmap = QPixmap()
self.move(300, 200)
self.setWindowTitle('Red Rock')

self.addedWidget = None

self.fillImage()

self.setLayout(self.hbox)

self.show()

def fillImage(self):

step = 128
for x in range(0, 512, step):
for y in range(0, 512, step):

rn = random.randrange(0, 360)
self.gx = math.cos(math.radians(rn))
self.gy = math.sin(math.radians(rn))

for x1 in range(0, step):

t = -1+(x1/step)*2
color = (1 - (3 - 2*abs(t))*t**2)

for y1 in range(0, step):

t1 = -1+(y1/step)*2
color1 = (1 - (3 - 2*abs(t1))*t1**2)
result = (255/2)+(color * color1 * (t*self.gx+t1*self.gy) )*(255/2)
c1 = self.image.pixel(x+x1, y+y1)
c = QColor(c1).red()
self.image.setPixel(x+x1, y+y1, qRgb(result+c, result+c, result+c))


self.pixmap = self.pixmap.fromImage(self.image)

if self.lbl == None:
self.lbl = QLabel(self)
else:
self.lbl.setPixmap(self.pixmap)

if self.addedWidget == None:
self.hbox.addWidget(self.lbl)
self.addedWidget = True

self.repaint()
self.update()


def main():

app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())


if __name__ == '__main__':
main()

Вернуться к началу
 Профиль  
Cпасибо сказано 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

 Похожие темы   Автор   Ответы   Просмотры   Последнее сообщение 
Перечень маленьких номеров

в форуме Пределы числовых последовательностей и функций, Исследования функций

Fobo5

2

162

28 дек 2011, 11:23

Задачи для самых умных

в форуме Теория вероятностей

Nickolas

0

123

17 окт 2015, 19:27


Часовой пояс: UTC + 4 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved