シンプルで高速な地形生成アルゴリズム

こんにちは、ハブロフスク! この記事では、ランドスケープを生成する簡単で迅速な方法について説明します。 アルゴリズム自体の分析を進める前に、ランドスケープの生成に関して、ネットワーク上でこのアルゴリズムに気付かなかったことに注意したいと思いますが、レベルを生成するための同様のアルゴリズムが記事の最後のリンクに記載されています。



どのような状況でアルゴリズムが便利ですか



最近、私はタスクに直面しました。3次元のランドスケープで簡単な戦略を書くことです。 現在、C ++でのプログラミング経験がほとんどないため、「diamond-square」を作成しようとすると、突然エラーが発生しました(「diamond-square」に関する記事へのリンクも最後にあります)。 現実的な風景を与えない、簡単に作成できるアルゴリズムが必要だったため、この方法は最初に初心者に役立ちます。



アルゴリズムと結果



アルゴリズム自体を説明する前に、その結​​果を共有します。



画像



アルゴリズムは、ランダムな座標のプログラムがランダムなサイズの長方形でマップを埋めることです。 マップは、風景の高さのマップを表す2次元配列の形をしています。



簡単にするために、長方形構造を作成します。



struct tRect { int x1, y1, x2, y2; }
      
      





変数x1およびy1は長方形の左下座標、x2およびy2は右上座標です。



させてください:



-マップはHM [mapsizex] [mapsizey]の配列として表示されます。

-mapsizeyおよびmapsizex-マップのサイズを決定する変数。

-genStep-長方形の数を決める変数。

-zscale-高さのカードの特定の膨張係数。 数字に置き換えることができます。

-recSizexとrecSizeyは、長方形のサイズの制限です。



次に、マップを四角形で塗りつぶす必要があります。



 for (int i=0; i<genStep; i++) { genRect.x1 = rand()%mapsizex; genRect.y1 = rand()%mapsizey; genRect.x2 = genRect.x1 + recSizex / 4 + rand()%recSizex; genRect.y2 = genRect.y1 + recSizey / 4 + rand()%recSizey; if (genRect.y2 > mapsizey) genRect.y2 = mapsizey; if (genRect.x2 > mapsizex) genRect.x2 = mapsizex; for (int i2 = genRect.x1; i2<genRect.x2; i2++) for (int j2 = genRect.y1; j2<genRect.y2; j2++) Map.HM[i2][j2]+= float(zscale) / float(genStep) + rand()%50 / 50.0; }
      
      





スクリーンショットからの救済は、値によって得られました。



genStep = 1024

zscale = 512

mapsizexおよびmapsizey = 128

recSize = 10


次に、可能な限りの方法で画面に地図を表示します。 私の場合、openGl + glfw。



アルゴリズムの長所と短所



利点:





短所:





この方法は、すでに前述したように、初心者や時間に非常に制限がある人に主に適しています。



この記事がお役に立てば幸いです。



ゲームレベルの生成に関する記事

「ダイヤモンドスクエア」に関する記事



All Articles