I define my ranges according to the average altitude of the map and its standard deviation.

First, I compute the cumulative histogram cumHisto:

var cumHisto = 0; for (var i = 0; i < World.width; i++) { for (var j = 0; j < World.height; j++) { cumHisto += World.mapData[i][j]; } // for j } // for i

Then, I compute the average altitude avgHeight:

var nbPoints = World.width * World.height; var avgAltitude = cumHisto / nbPoints;

I need a loop to compute the standard deviation stdevAltitude, based on the variance varAltitude:

var varAltitude = 0; for (var i = 0; i < World.width; i++) { for (var j = 0; j < World.height; j++) { var diff = World.mapData[i][j] - avgAltitude; varAltitude += diff * diff; } // for j } // for i var varAltitude = varAltitude / nbPoints; var stdevAltitude = Math.sqrt(varAltitude);

Given the average altitude and its standard deviation, I can define four ranges which seem to give quite reliable results:

for (var i = 0; i < World.width; i++) { for (var j = 0; j < World.height; j++) { if (World.mapData[i][j] < avgAltitude) { World.mapData[i][j] = Terrain.DEEP_OCEAN; } else if (World.mapData[i][j] < avgAltitude + 0.5 * stdevAltitude) { World.mapData[i][j] = Terrain.COASTAL_OCEAN; } else if (World.mapData[i][j] < avgAltitude + 2 * stdevAltitude) { World.mapData[i][j] = Terrain.FLAT; } else { World.mapData[i][j] = Terrain.MOUNTAIN; } } // for j } // for i