2017-03-19 80 views
0

我目前正在尝试实现钻石正方形算法,虽然东西有点工作,但我被HeightMap弄糊涂了。意外钻石正方形算法结果

这就是:

heightmap result

正如你所看到的广场是由brighters值清楚地说明,而losanges由暗值概述。 我真的不明白为什么。我知道地图的大小真的很小,但我不认为这是预期的结果,而且我得到了更大尺寸的相同行为。

这里是我的代码:

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); 
    } 
} 

而且,你永远不调整你的随机性变量(decalage),它应该得到小,因为你减少espace大小。