Terrain Generation by Hand
This article originally appeared in the July/August 2020 issue.
Although there are many programs out there for terrain generation, most of which can superimpose any sort of grid over the terrain, or which allow the terrain to be imported into a program which does, there’s still occasionally a place and/or need for manual terrain generation. Andrew Morris has provided two methods (the names are his) that give reasonable results while requiring only pencil, paper, and a few dice.
Method 1: “Fractal”
-2 | Deep Ocean |
-1 | Shallow Ocean |
0 | Mixed Land and Water |
1 | Plains |
2 | Rolling Plains |
3 | Hills |
4 | Mountains |
Define the different land forms you wish to use and distinguish on the map. Mr Morris defined seven, based on altitude (table, right), but you may define more or fewer, and based on other factors (e.g., vegetation or biomes).
Apply the following algorithm:
- Take a triangle, and assign one of the landforms to each corner.
- For each side:
- Take the average A of the values of the two landforms
- Roll a die
1D Integer Fraction 1 -1 -1.5 2 -1 -0.5 3 0 -0.5 4 0 +0.5 5 +1 +0.5 6 +1 +1.5 - if A is an integer, look up the die roll in column 1 [1D] of the table, and take the value from column 2 [Integer]
- if A is not a whole number, look up the die roll in column 1 [1D], and take the value from column 3 [Fraction]
- Add the number from the indicated column to the value of A
- Assign this result to the midpoint of the line.
- Add new lines connecting the midpoints whose values you just determined. This will create four new triangles nested in the original one.
- Repeat steps 2. and 3. until you have reached the desired granularity for the map.
This is not statistically balanced, but it is fine for generating Traveller-style hex maps.
Three iterations will get to Traveller icosahedral world-map resolution for a bit more than one triangle. Note that this method gives the centers of the hexes. For non-triangular areas, divide the area into triangles and use this method for each triangle, remembering to preserve the already-generated edges of each triangle.
Example
Let’s generate a section of a continent through three iterations. We’ll use Andrew’s terrains from the beginning of this article. Arbitrarily, we’ll start with the top of the triangle being “Hills” (3), the lower left corner being “Rolling Plains” (2), and the lower right being “Shallow Ocean” (-1).
Iteration 1: (Note: we will calculate averages and add rolls from left to right, and top to bottom.) The midpoints of the three sides of the triangles are the hexagons marked with stars. The averages are 2.5 (3+2÷2), 1 (3-1÷2), and 0.5 (2-1÷2). We roll 2, 5, and 6, so we add –0.5, +1, and +1.5, giving 2, 2, and 2 (coincidentally). Our “map” is now as shown, with the next spaces to be calculated marked by stars.
Iteration 2: Each iteration will be dealing with three times the number of spaces as the previous one. Again, working left-to-right and top to bottom, the averages are (I won’t include the computations) 2.5, 2.5, 2, 2, 2, 2, 0.5, 2, 0.5. We roll 5, 6, 2, 4, 6, 4, 5, 2, and 1, making the increments +0.5, +1.5, -1, 0,+1, 0, +0.5, -1, -1.5, and the grid fills in as follows:
Iteration 3: All of the remaining spaces will be filled in, using the same procedure. The final result:
The result isn’t unreasonable for “real” land, and you can color it in or add detail:
Here, I’ve just done some simple coloring: dark blue for –1 (shallow ocean), light blue for 0 (mixed land and water), dark green for 1 (plains), light green for 2 (rolling plains), orange for 3 (hills), and grey for 4 (mountains). If you wanted, you could perhaps draw coastlines and islands in the light blue areas, or even run the process through a few more iterations and develop more detailed transitions, which might also give you an idea of ridge lines, river valleys, and so on. Don’t feel obligated to stick with the example range of terrains, either; you can add more, or use completely different criteria for different kinds of maps (for example, population density).
Method 2: “Islands”
This is not so well developed but seems robust enough. It is great if you like rivers, since every downward slope inevitably leads to the sea.
Start with any kind of mesh—it doesn’t even have to be a “regular” shape. Then, apply the following algorithm:
- Assign negative heights to the outermost points on the mesh.
- Start with the point with lowest height (H) that has at least one adjacent point with no height assigned and work your way up.
- For each neighboring point with no height assigned, roll a random increment i, and assign the point a height of H+i.
- When all of the points adjacent to the chosen point have been assigned heights, repeat the process, choosing the point with lowest height H and unassigned neighbors. Note that the random increment i cannot be negative, but zero is an acceptable value.
The rate at which the land rises is slower than you might expect because the gradient is always taken from the lowest point.
A bit of experimentation showed that an example with reasonably illustrative results would be unreasonably complex to show in this article, so no example for this algorithm will be provided.