2017-02-25 95 views
0

我試圖平滑我的2D數組。我確信有更好的方法,但我還沒有找到它。到目前爲止,我正在使用這一點代碼來平滑它。平滑數據的問題

您可以在後面看到有一個區域,單個條目在錯誤的方向上升/下降。它使單個像素看起來比周圍的任何物體都更暗/更輕。

我在做什麼錯誤,在我的數據平滑?

 for (int i = 0; i < 3; i++) { 
      for (int y = 0; y < mapChunkSize + 2; y++) { 
       for (int x = 0; x < mapChunkSize + 2; x++) { 
        int count = 0; 
        int dir = 0; 
        if (x - 1 >= 0 && y - 1 >= 0 && noiseMap [x - 1, y - 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x - 1, y - 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 
        if (x - 1 >= 0 && noiseMap [x - 1, y] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x - 1, y] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 
        if (x - 1 >= 0 && y + 1 <= mapChunkSize && noiseMap [x - 1, y + 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x - 1, y + 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 

        if (y - 1 >= 0 && noiseMap [x, y - 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x, y - 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 
        if (y + 1 <= mapChunkSize && noiseMap [x, y + 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x, y + 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 

        if (x + 1 <= mapChunkSize && y - 1 >= 0 && noiseMap [x + 1, y - 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x + 1, y - 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 
        if (x + 1 <= mapChunkSize && noiseMap [x + 1, y] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x + 1, y] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 
        if (x + 1 <= mapChunkSize && y + 1 <= mapChunkSize && noiseMap [x + 1, y + 1] != noiseMap [x, y]) { 
         count += 1; 
         if (noiseMap [x + 1, y + 1] > noiseMap [x, y]) { 
          dir += 1; 
         } else { 
          dir -= 1; 
         } 
        } 

        if (count > 4) { 
         if (dir > 0) { 
          noiseMap [x, y] += stepHeight; 
         } 
         if (dir < 0) { 
          noiseMap [x, y] -= stepHeight; 
         } 
        } 
       } 
      } 
     } 

前:

enter image description here

後:

enter image description here

+1

一個容易的事情嘗試是使用源和目標陣列,讓你產生每平滑值僅源自未平滑的值,並且永遠不會來自已經平滑的值。 – mcdowella

回答

0

該代碼看起來像一場噩夢調試。話雖如此,我已經看到過像這樣的圖像文物,它看起來像mcdowella所說的那樣:你正在分配2D陣列,同時讀取它,從而導致你的檢查不準確。雖然很難破譯。

我確定你可以通過簡單地增加單元格鄰居的平均值來獲得相同的行爲。下面的例子應該有希望做的伎倆(其未經檢驗,但希望傳達的想法):

//Assumes all height values in the 2D array are normalized between 0-1 
float[,] RampAverage(float[,] values, int rampSteps){ 
    int valuesWidth = values.GetLength(0); 
    int valuesHeight = values.GetLength(1); 
    float[,] tempValues = new float[valuesWidth,valuesHeight]; 

    for (int x = 0; x < valuesWidth; x ++){ 
     for(int y = 0; y < valuesHeight; y++){ 
      Vector2 key = new Vector2(x,y); 
      float neighborAverage = GetNeighborAverage(values,key); 
      tempValues[x,y] = Ramp(neighborAverage,rampSteps); 
     } 
    } 

    return tempValues; 
} 

// Assumes all values are between 0-1 
float Ramp(float value, int rampSteps){ 
    float step = 1/rampSteps; 
    int d = Mathf.FloorToInt(value/step); 
    return d*step; 
} 

float GetNeighborAverage(float[,] values, Vector2 key){ 
    int contributors = 0; 
    float value = 0; 

    int maxX = values.GetLength(0)-1; 
    int maxY = valuse.GetLength(1)-1; 

    for (int y = -1; y <= 1; y++) 
    { 
     for (int x = -1; x <= 1; x++) 
     { 
      int xIndex = x + (int)key.x; 
      int yIndex = y + (int)key.y; 
      if (xIndex >= 0 && yIndex >= 0 && xIndex <= maxX-1 && yIndex <= maxY-1) 
      { 
       value += values[xIndex,yIndex]; 
       contributors ++; 
      } 
     } 
    } 
    return value/contributors; 
}