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!

Log in or register to write something here or to contact authors.