2017-03-19 14 views
0

私は現在、ダイヤモンドスクエアアルゴリズムを実装しようとしていますが、何か問題はありますが、HeightMapが混乱しています。予期しないダイヤモンドスクエアアルゴリズムの結果

ここにある:

heightmap result

あなたはlosangesが暗い値で概説されている間の正方形がはっきり、brighters値によって概説されて見ることができるように。 私は本当になぜ理解できないのですか。とにかく地図の大きさは実際には小さいが、私はそれがとにかく予想される結果だとは思っていないし、より大きなサイズで同じ動作をする。ここで

は私のコードです:

public class TerrainBuilder 
{ 
    private Terrain Terrain = null; 
    private Random r = new Random(); 

    private int espace; 

    public void Init(Terrain _terrain) 
    { 
     Terrain = _terrain; 
     espace = Terrain.SIZE - 1; 
    } 

    public void DiamondAlgoritm() 
    { 
     if (Terrain == null) 
      return; 
     //Initialization 
     Terrain.HeightMap[0, 0] = r.Next() % 255; 
     Terrain.HeightMap[0, Terrain.SIZE - 1] = r.Next() % 255; 
     Terrain.HeightMap[Terrain.SIZE - 1, 0] = r.Next() % 255; 
     Terrain.HeightMap[Terrain.SIZE - 1, Terrain.SIZE - 1] = r.Next() % 255; 

     //randominess 
     int decalage = 128; 

     while (espace > 1) 
     { 
      int demiSpace = espace/2; 
      //diamond phase 
      for (int i = demiSpace; i < espace; i = i + espace) 
      { 
       for (int j = demiSpace; j < espace; j = j + espace) 
       { 
        var avg = Terrain.HeightMap[i + demiSpace, j + demiSpace] + Terrain.HeightMap[i + demiSpace, j - demiSpace] + Terrain.HeightMap[i - demiSpace, j + demiSpace] + Terrain.HeightMap[i - demiSpace, j - demiSpace]; 
        avg /= 4; 
        Terrain.HeightMap[i, j] = Normalize(avg + r.Next() % decalage); 
       } 
      } 
      //carre phase 
      for (int i = 0; i < Terrain.SIZE; i += demiSpace) 
      { 
       int delay = 0; 
       if (i % espace == 0) 
        delay = demiSpace; 


       for (int j = delay; j < Terrain.SIZE; j += espace) 
       { 
        double somme = 0; 
        int n = 0; 

        if (i >= demiSpace) 
         somme = somme + Terrain.HeightMap[i - demiSpace, j]; 
        n = n + 1; 

        if (i + demiSpace < Terrain.SIZE) 
         somme = somme + Terrain.HeightMap[i + demiSpace, j]; 
        n = n + 1; 

        if (j >= demiSpace) 
         somme = somme + Terrain.HeightMap[i, j - demiSpace]; 
        n = n + 1; 

        if (j + demiSpace < Terrain.SIZE) 
         somme = somme + Terrain.HeightMap[i, j + demiSpace]; 
        n = n + 1; 


        Terrain.HeightMap[i, j] = Normalize(somme/n + r.Next() % decalage); 
       } 
      } 
      espace = demiSpace; 
     } 



    } 

    private double Normalize(double value) 
    { 
     return Math.Max(Math.Min(value, 255), 0); 
    } 
} 

私はこの問題を理解するためにいくつかの助けをしたいと思います。

答えて

1

ダイヤモンドフェーズでは、マップ全体を反復処理しません。最初の四角形を計算するだけです(espaceに等しい)。このような

変更あなたのループの終了条件は:

for (int i = demiSpace; i < Terrain.SIZE; i = i + espace)   
{ 
    for (int j = demiSpace; j < Terrain.SIZE; j = j + espace) 
    { 
     var avg = Terrain.HeightMap[i + demiSpace, j + demiSpace] + 
        Terrain.HeightMap[i + demiSpace, j - demiSpace] + 
        Terrain.HeightMap[i - demiSpace, j + demiSpace] + 
        Terrain.HeightMap[i - demiSpace, j - demiSpace]; 
     avg /= 4; 
     Terrain.HeightMap[i, j] = Normalize(avg + r.Next() % decalage); 
    } 
} 

はまた、あなたがespaceのサイズを小さくすると小さくなるはずですあなたのランダム変数(decalage)を、調整することはありません。