您的閾值算法需要更合理。您需要實際指定要在大小方面刪除的內容,而不僅僅是高度。基本上,簡單的閾值設置「海平面」,低於這個水平的任何東西都是水。問題在於,因爲用於生成地形的算法是偶然的,所以小的區域可能會被水填滿。
要解決這個問題,你需要基本上確定水域的大小,只允許更大的區域。
這樣做的一個簡單方法是不允許單個「像素」表示水。基本上不要將它們設置爲水(可以使用位圖,其中每個位代表是否有水)或者簡單地提升水平。這應該可以讓大部分單個像素從圖像中清除出來,並將其清除很多。
您可以擴展此爲N像素(本質上代表面積)。基本上你必須通過計算連接像素來確定水域的大小。問題在於,它允許很長的薄區域(可能代表河流)。
所以最好再採取一步,分別計算寬度和長度。
例如,以檢測一個簡單的單個像素
如果地圖[I,J] <閾& &(地圖[I-1,J-1]>閾& & ... & &地圖[I + 1,j + 1]>閾值),則區域= 1
將檢測隔離像素。
你可以修改這個來檢測更大的羣體並編寫一個通用算法來測量任何大小的潛在「海洋」......然後它應該很容易生成任何最小(和最大)大小的海洋地圖想。下一步是「固定」(或使用位圖)地圖中可能低於海平面但未轉換爲實際水的部分。即,因爲我們通常希望海平面以下的東西容納水。通過使用位圖,您可以允許在水中的水或陸地上的水等。
如果你使用平滑,它可能會工作得很好,但你仍然會遇到這樣的問題。平滑減少了「海洋」的大小,但是大洋可能會變成一個小而一個小的最終成爲單個像素。根據地圖的整體平均值,經過足夠的迭代後,您可能會得到全部水或全部土地。模糊也減少了地圖的細節。
好消息是,如果你用可控參數設計你的算法,那麼你可以控制像地圖中有多少海洋,它們有多大,它們的方形(如果你想要的話多麼圓形) ,或者可以使用多少總水量等)。
您爲此付出的更多努力更準確地模擬了現實。最終,如果你想要變得無限複雜,你可以考慮地形是如何形成的等等......但是,當然,這些簡單算法的全部重點是讓它們在合理的時間內可以計算。
研究形態學操作,特別是'關閉' – chris
爲什麼不爲一個像素應用模糊/平均的像素,如果它是藍色的,而且沒有鄰居是?這應該很容易做到,並減少「點」效應,即任何沒有至少一個即時藍色鄰居的藍色像素獲得所有鄰居的平均顏色。 – Thomas
我沒有想到這一點。因爲湖泊沒有規律的間隔,我認爲檢測它們是O(n^2)。我對更好的解決方案感興趣,但這應該起作用。 –