Python Aléatoire de Génération de Carte avec le Bruit de Perlin
Récemment, j'ai été de tenter de vaincre l'une de mes principales faiblesses dans la programmation en général, de génération aléatoire. Je pensais que ce serait une chose facile à faire, mais le manque d'information simple est de me tuer sur elle. Je ne veux pas paraître idiot, mais il se sent à moi comme la plupart des informations provenant d'endroits comme cette sont écrits pour les mathématiciens qui est allé au collège d'études supérieures en mathématiques théoriques. Je ne comprends juste pas ce que je suis censé faire avec cette information afin de pouvoir l'appliquer à la programmation dans un langage comme python.
J'ai travaillé quelques jours à regarder des équations et de la tentative tentative après tentative, mais encore après tous ces jours, après l'extraction mon code à part, encore et encore, tout ce qui a été fonctionne correctement l'ensemble de ce temps, est-ce le bruit de générateur pour produire de base du bruit:
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='')
Ce code donne ce résultat:
##-######--#--#-#--##-###-###---#-##-#-----#--##-#
#-#-##-##-#----##------##--#####-#-##---#--#-##---
-------#-#------#---#-#---###--#--#-###-----##-#--
######--#-#-#--####-###---#---###-##--#-#-##--####
-#----###--------##--##--##-#-#--#----###-####--##
---####-#--#--###-#-#--#--#####--####-#-##-##--#--
----#--####-#-#-#-#-#---#--###------###--#-######-
--###--#-###-------#-##--###---#-####----###-#####
#----##--##-#--##-###--#----#-#-##--##-#-##---###-
##---##----##--##--#--#--###-###-#--#-##---#------
-##----#-###---######---#-#---#---###---#---###-##
#--##-##-###-###---#--##-##--##-##-#-#-##--#-#-##-
Je suis désireux de faire éventuellement produire quelque chose comme ceci:
--------------------------------------------------
------------------####----------------------------
-----------------#####----------------------------
----------------#####-----------------------------
---------------#####--------------###-------------
---------------#####--------------###-------------
---------------------------------####-------------
---######------------------------####-------------
---######------------###--------------------------
----########---------###--------------------------
-----#######---------###--------------------------
------###-----------------------------------------
Comment puis-je gérer pour lisser le bruit blanc je génère, et de le transformer dans les îles? Quelqu'un peut l'expliquer de façon très simpliste pour moi?
J'ai peut-être penser à propos de tout cela très mal.
- Je prendrais user1483482 de la suggestion. Si vous voulez en savoir plus sur le fonctionnement interne essayez de regarder ici: devmag.org.za/2009/04/25/perlin-bruit j'ai reproduit son code en python, et il fonctionne, mais il est très lent, même avec numpy.
Vous devez vous connecter pour publier un commentaire.
Suffit d'utiliser Le bruit. Les bons programmeurs code, grande réutilisation.
Voici un exemple de base (d'autres peuvent être trouvés dans la /des exemples de répertoire).
La réponse directe à votre question est "Non, vous ne pouvez pas faire ce que vous demandez", et la deuxième réponse est "Oui, vous pensez au sujet de cette tout faux".
La raison en est que vous êtes la génération aléatoire de bruit. Ce que vous demandez est cohérent bruit. Ils sont deux totalement différents animaux et vous ne pouvez pas obtenir cohérent de bruit de bruit aléatoire. D'où ma réponse.
Pour expliquer pourquoi, vous devez comprendre ce simple énoncé dont je suis le répéter depuis le excellent libnoise documentation:
Cohérente bruit
Un type de lisse de bruit pseudo-aléatoire.
Cohérente bruit est généré par un ensemble cohérent de bruit en fonction, qui a trois propriétés importantes:
Bruit aléatoire n'a pas de ces propriétés, et est donc totalement inadaptés pour ce que vous essayez d'atteindre.
Je suggère d'étudier Ken Perlin dernier (amélioré) de référence de mise en œuvre et son SIGGRAPH 2002 notes.
Si vous ne comprenez pas ou le mettre en œuvre, alors il suffit d'utiliser une bibliothèque comme libnoise, un excellent et bien utilisé LGPL bibliothèque à l'origine en C++ qui a également été porté sur de nombreuses autres langues.
Plutôt l'utilisation d'automates cellulaires. L'algorithme que vous trouverez ici crée des modèles similaires que vous vous voulez voir:
C'est un plaisir que peu de problème, vous pouvez résoudre ce problème avec ce type d'algorithme:
Et avec un peu de l'impression de la mise en forme, il fonctionne bien. Démonstration:
de sortie:
Bien sûr un Perlin ou Simplex de bruit comme les autres answerers indiqué serait un peu mieux les regarder. Si vous voulez essayer, remplacez les étapes 1 et 2 avec Perlin/Simplex ou tout autre bruit que vous pouvez saisir et essayez à nouveau.
Cet article (et d'autres dans le même projet) est une assez bonne introduction aux problèmes de codage. Le code C++.
https://code.google.com/p/fractalterraingeneration/wiki/Perlin_Noise
Voici un document sur l'utilisation du Simplexe algorithme de bruit (améliore d'une certaine façon à l'origine le Bruit de Perlin algorithme). Il comprend des exemples de code Java. http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
Aussi du même auteur fait ce code du domaine public récemment
http://staffwww.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java
Il ne devrait pas être trop difficile de traduire les concepts en Python, bien que Python idiomes pour les structures de données sont un peu différentes.