15

最近、私はプログラミング全般における私の主な弱点の 1 つであるランダム生成を克服しようと試みています。簡単にできると思っていたのですが、簡単な情報がなくて困っています。ばかげた言い方をするつもりはありませんが、このような場所からの情報のほとんどは、理論数学を卒業するために大学に行った数学者向けに書かれているように感じます。Pythonなどの言語でのプログラミングに適用するために、その情報をどうするつもりなのか理解できません。

私は数日間、方程式をじっと見つめ、試行錯誤を試みてきましたが、コードを何度も引き裂いた後も、何日も経った後でも、この間ずっと適切に機能しているのは、基本的なノイズを生成するこのノイズジェネレーターだけです。

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='')

このコードは次の結果を生成します。

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

最終的には次のようなものを生成したいと考えています。

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

生成したホワイト ノイズを滑らかにして島に変えるにはどうすればよいでしょうか? 誰かが私のために非常に単純な方法でそれを説明できますか?

私はこれらすべてについて非常に間違っていると考えているかもしれません。

4

5 に答える 5

12

Noiseを使用できます。優れたコーダー コード、優れた再利用。しかし2018年以降開発は断念。

これは非常に基本的な例です(他の例は /examples ディレクトリにあります)。

于 2013-07-22T04:51:40.783 に答える
7

あなたの質問に対する直接的な答えは「いいえ、あなたが求めていることをすることはできません」であり、2番目の答えは「はい、あなたはこれについてすべて間違っていると考えています」です.

その理由は、完全にランダムなノイズを生成しているためです。あなたが求めているのはコヒーレントノイズです。これらは 2 つの完全に異なる動物であり、ランダム ノイズからコヒーレント ノイズを得ることができません。したがって、私の答え。

理由を説明するには、優れた libnoise ドキュメントから繰り返しているこの簡単なステートメントを理解する必要があります。


コヒーレントノイズ

滑らかな疑似ランダム ノイズの一種。

コヒーレント ノイズは、次の 3 つの重要な特性を持つコヒーレント ノイズ関数によって生成されます。

  • 同じ入力値を渡すと、常に同じ出力値が返されます。
  • 入力値がわずかに変化すると、出力値がわずかに変化します。
  • 入力値が大きく変化すると、出力値がランダムに変化します。

ランダム ノイズにはこれらの特性がないため、達成しようとしているものにはまったく適していません。

Ken Perlin の最新の (改善された) 参照実装と彼のSIGGRAPH 2002ノートを研究することをお勧めします。

これを理解または実装できない場合は、libnoiseなどのライブラリを使用してください。これは、他の多くの言語にも移植されている C++ の優れたよく使用される LGPL ライブラリです。

于 2016-03-15T23:49:22.247 に答える
3

むしろ、セルオートマトンを使用してください。ここにあるアルゴリズムは、あなたが見たい同様のパターンを作成します:

. . . . . . . . . . . . . . .
. . . . . # # . . . . . # . .
. . . . # # # # . . . # # # .
. . . . . # # # # . . # # # .
. . . . . . # # # # # # # . .
. . . . . . # # # # # # # . .
. . . . # # # # # # # # # . .
. . . # # # # # # # # # # . .
. . # # # # # # . # . # # . .
. . # # # # # . . # . . . . .
. . . # # # # . . . # # # . .
. . . # # # # . . . # # # # .
. . # # # # . . . . . # # # .
. . # # # # . . . . . # # . .
. . . . . . . . . . . . . . .
于 2014-08-20T14:07:41.087 に答える
0

この記事 (および同じプロジェクトの他の記事) は、コーディングの問題についての非常に優れた入門書です。C++ コード。 https://code.google.com/p/fractalterraingeneration/wiki/Perlin_Noise

これは、シンプレックス ノイズ アルゴリズムの使用に関する論文です (元のパーリン ノイズ アルゴリズムを特定の方法で改善します)。Java コードの例が含まれています。http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf

また、同じ作者が最近、このコードをパブリック ドメインにしました http://staffwww.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java

Python のデータ構造のイディオムは少し異なりますが、概念を Python に翻訳するのはそれほど難しくありません。

于 2014-01-02T04:08:41.040 に答える