2013-07-22 2 views
5

Недавно я пытался победить одну из моих основных недостатков в программировании в целом, случайное поколение. Я думал, что это будет легко сделать, но отсутствие простой информации убивает меня. Я не хочу казаться глупым, но мне кажется, что большая часть информации из таких мест, как this, написана для математиков, которые поступили в колледж, чтобы закончить теоретическую математику. Я просто не понимаю, что я должен делать с этой информацией, чтобы применить ее к программированию на языке, таком как python.Python Случайное создание карты с шумом Perlin

Я работаю несколько дней, глядя на уравнения и пытаясь попытаться после попытки, но все же после всех этих дней, после разрыва моего кода снова и снова, все, что работало правильно все это время, - это генератор шума генерировать основной шум:

import random 
import math 

random.seed(0) 

def generateWhiteNoise(width,height): 
    noise = [[r for r in range(width)] for i in range(height)] 

    for i in range(0,height): 
     for j in range(0,width): 
      noise[i][j] = random.randint(0,1) 

    return noise 

noise = generateWhiteNoise(50,12) 

for i in noise: 
    print() 
    for o in i: 
     if(o == 0): 
      print('-',end='') 
     else: 
      print('#',end='') 

этот код производит этот результат:

##-######--#--#-#--##-###-###---#-##-#-----#--##-# 
#-#-##-##-#----##------##--#####-#-##---#--#-##--- 
-------#-#------#---#-#---###--#--#-###-----##-#-- 
######--#-#-#--####-###---#---###-##--#-#-##--#### 
-#----###--------##--##--##-#-#--#----###-####--## 
---####-#--#--###-#-#--#--#####--####-#-##-##--#-- 
----#--####-#-#-#-#-#---#--###------###--#-######- 
--###--#-###-------#-##--###---#-####----###-##### 
#----##--##-#--##-###--#----#-#-##--##-#-##---###- 
##---##----##--##--#--#--###-###-#--#-##---#------ 
-##----#-###---######---#-#---#---###---#---###-## 
#--##-##-###-###---#--##-##--##-##-#-#-##--#-#-##- 

Я хотел это в конечном счете, производить что-то вроде этого:

-------------------------------------------------- 
------------------####---------------------------- 
-----------------#####---------------------------- 
----------------#####----------------------------- 
---------------#####--------------###------------- 
---------------#####--------------###------------- 
---------------------------------####------------- 
---######------------------------####------------- 
---######------------###-------------------------- 
----########---------###-------------------------- 
-----#######---------###-------------------------- 
------###----------------------------------------- 

Как я могу сгладить генерируемый белый шум и превратить его в острова? Может ли кто-нибудь объяснить это очень упрощенным способом для меня?

Возможно, я думаю обо всем этом очень неправильно.

+1

Я бы принял предложение user1483482. Если вы хотите узнать больше о внутренней работе, попробуйте посмотреть здесь: http://devmag.org.za/2009/04/25/perlin-noise/ Я воспроизвел его код на python, и он работает, но это ** очень ** медленно, даже с numpy. – seth

ответ

5

Просто используйте Noise. Хороший код кодекса, большое повторное использование.

very basic example (другие могут быть найдены в каталоге/examples).

+0

Вот проблема, я ищу, чтобы на самом деле генерировать шум, потому что, если бы я использовал другой язык, который не имел указанной библиотеки. –

0

Эта статья (и другие в том же проекте) представляет собой довольно хорошее представление о проблемах с кодированием. C++. https://code.google.com/p/fractalterraingeneration/wiki/Perlin_Noise

Настоящая статья посвящена использованию алгоритма симплексного шума (по-видимому, в оригинальном алгоритме Perlin Noise улучшается). Он включает пример Java-кода. http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf

Кроме того, тот же автор сделал этот код публичный домен недавно http://staffwww.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java

Оно не должно быть слишком трудно перевести понятия в Python, хотя идиомы языка Python для структур данных немного отличаются.

1

Скорее используйте клеточные автоматы. Алгоритм, который вы найдете here создает подобные модели, которые вам, что вы хотели бы видеть:

. . . . . . . . . . . . . . . 
. . . . . # # . . . . . # . . 
. . . . # # # # . . . # # # . 
. . . . . # # # # . . # # # . 
. . . . . . # # # # # # # . . 
. . . . . . # # # # # # # . . 
. . . . # # # # # # # # # . . 
. . . # # # # # # # # # # . . 
. . # # # # # # . # . # # . . 
. . # # # # # . . # . . . . . 
. . . # # # # . . . # # # . . 
. . . # # # # . . . # # # # . 
. . # # # # . . . . . # # # . 
. . # # # # . . . . . # # . . 
. . . . . . . . . . . . . . . 
3

прямой ответ на ваш вопрос: «Нет, вы не можете делать то, что вы просите», а второй ответ «Да , вы думаете об этом все неправильно ».

Причина в том, что вы генерируете совершенно случайный шум. То, о чем вы просите, - это когерентный шум. Это два совершенно разных животных, и вы не можете получить когерентный шум от случайного шума. Отсюда мой ответ.

Чтобы объяснить, почему вы должны понять это простое заявление, которое я повторяющийся из excellent libnoise documentation:


когерентного шум

Типа гладкого псевдослучайного шума.

Когерентная шум генерируется функцией когерентного шума, который имеет три важных свойства:

  • переходящая в том же значении входного всегда будет возвращать то же значение выходного сигнала.
  • Небольшое изменение входного значения приведет к небольшому изменению выходного значения.
  • Большое изменение входного значения приведет к случайному изменению выходного значения.

Случайный шум не имеет этих свойств, и поэтому совершенно не подходит для того, что вы пытаетесь достичь.

Я предлагаю изучить Ken Perlin's latest (improved) reference implementation и его примечания SIGGRAPH 2002.

Если вы не можете понять или реализовать это, просто используйте библиотеку, такую ​​как libnoise, отличную и хорошо используемую библиотеку LGPL, первоначально на C++, которая также была перенесена на многие другие языки.

0

Это забавная небольшая проблема, вы можете решить с таким родом алгоритм:

  1. генерировать небольшой равномерный шум
  2. ресамплинга более высокое разрешение (давая вам плавное изображение с шумом)
  3. Применить порог, чтобы получить ложный/массив
  4. относящихся к истинному норду
  5. Карты Ложной/Верные «-»/«#»

И с небольшим количеством Прина Это хорошо работает. Демонстрация:

import numpy as np 
np.set_printoptions(threshold=np.nan) 
from scipy.ndimage.interpolation import zoom 
arr = np.random.uniform(size=(4,4)) 
arr = zoom(arr, 8) 
arr = arr > 0.5 
arr = np.where(arr, '-', '#') 
arr = np.array_str(arr, max_line_width=500) 
print(arr) 

выход:

[['-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '#' '#' '#'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['#' '#' '#' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-'] 
['-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-']] 

Конечно Перлин или Simplex шум, как и другие, указанные отвечающие бы дать немного лучше выглядеть. Если вы хотите попробовать это, замените шаги 1 и 2 с помощью Perlin/Simplex или любого другого шума, который вы можете захватить и повторите попытку.