This is a neat little algorithm for generating landscapes for video games, movies, screen savers and the like.

Say we start with a line segment AB like this:

A *** *** *** *** *** *** *** B

This line should be going in the direction which we eventually want the landscape to be going in.

Now, we add point C and split this segment into
smaller segments AC and BC. C is located horizontally
midway between points A and B, like so:

Ax + Bx Cx = ------- 2

and Cy is given by this formula:

Ay + By Cy = ------- + (Ay - By) rand(r) 2

where rand(a) is a function returning a random number between -a and a inclusive, and r is a number between 0 and .5 determining the "roughness" of the landscape.

Now our landscape looks something like
this:

A ***** ***** *** C ** ** ** ** B

Now, AC is split into AD and DC, while CB is split into
CE and EB, and the same calculations are performed. We
end up with something maybe like this:

A *** ***** C D *** **** E *** * ** B

Trust me, this looks a lot better when it's not ASCII art.

And so on and so forth this continues, until your landscape is as pretty as you want it to be!

This same technique can be applied to
three-dimensional landscapes, too. I'm not sure of any
standard method, but a plausible one would be
to split one triangle into three by adding a point as
described above:

A * * * * * * * * * * * * * B *************** C

Now we add D.

A * *** * * * * * * * D * * ** ** * * ** ** * B *************** C

It now becomes very difficult to exemplify this method, seeing as 3D ASCII art is an as-of-yet unexplored frontier. But you get the picture.

pfft informs me that a more standard method is to split each triangle into *four* small triangles, by adding three new points:

A * * * * * D ******* E ** ** * * * * * * * * B *************** C F

This seems to make an infinite amount more sense than my method, since now the triangles don't get all squishy. Thanks, pfft!