[Back to MATH SWAG index] [Back to Main SWAG index] [Original]

    program Chaos;

    {Triangular fractal generator

     Based on program "Chaos" published in Nibble, June 1989 (Vol. 10, No. 6)
     One-Liner winner written by Max Raymond of Huston, TX.  Program inspired
     by a PBS broadcast of Nova, called "Chaos".

     Adapted for Turbo Pascal by Scott Earnest, 1994.
     scott@whiplash.pc.cc.cmu.edu

     About the program:

     When the program is run, it will ask for 4 sets of coordinates.  The first
     three are the vertices of the triangle, and the fourth is the location of
     the "traveler", the point that moves around the screen leaving its path.
     The traveler may start at any position either inside or outside the tri-
     angle.  Press any key to exit the program.

     The original author's comment about the program:

       "A three-sided die is simulated, and its roll corresponds to one of
        the three vertices of the triangle.  The traveler will move halfway
        from its current point toward the vertex selected by the die roll.
        A copy of the traveler is left behind at its old position, while
        the traveler is redrawn at its new position.  The process is then
        repeated.  The pattern that emerges is a record of the traveler's
        journey, as it jumps from point to point."

    }

    uses graph, crt;

    const BGIPath : string[80] = 'E:\BP\BGI';

    type
      TPoint = record
        x, y : integer;
      end;

    var
      grDriver,
      grMode,
      grError : integer;

      MaxX, MaxY : word;

      TriExt : array [1 .. 4] of TPoint;

    procedure StartGraph;

    begin
      grDriver := Detect;
      initgraph (grDriver, grMode, BGIPath);
      grError := GraphResult;
      if grError <> grOk then
      begin
        writeln ('Graphics error:  ', GraphErrorMsg(grError));
        halt (1);
      end;
      MaxX := getmaxx;
      MaxY := getmaxy;
    end;

    procedure InputPoints;

    var
      pnum : byte;
      tx, ty : word;

      function inputnum (idx : byte; max : word; ch : char) : word;

      var
        inval, err : word;
        instr : string;

      begin
        repeat
          if idx < 4 then
            write ('Enter ',ch,' vertex #',idx,':  ')
          else
            write ('Enter "traveler" start ',ch,':  ');
          readln (instr);
          val (instr, inval, err);
          if (err > 0) or (inval > max) then
            writeln ('Invalid entry.  Please re-enter.');
        until (inval <= Max);
        inputnum := inval;
      end;

    begin
      writeln ('Screen range = X:(0-',MaxX,'); Y:(0-',MaxY,').');
      for pnum := 1 to 4 do
        begin
          TriExt[pnum].x := inputnum (pnum, MaxX, 'X');
          TriExt[pnum].y := inputnum (pnum, MaxY, 'Y');
        end;
    end;

    procedure DrawChaos;

    var
      select : byte;

    begin
      while keypressed do readkey;
      repeat
        select := random(3) + 1;
        TriExt[4].x := TriExt[4].x + (TriExt[select].x - TriExt[4].x) div 2;
        TriExt[4].y := TriExt[4].y + (TriExt[select].y - TriExt[4].y) div 2;
        putpixel (TriExt[4].x, TriExt[4].y, 15);
      until keypressed;
      while keypressed do readkey;
    end;

    begin
      Randomize;
      StartGraph;
      RestoreCRTMode;
      clrscr;
      InputPoints;
      SetGraphMode (GetGraphMode);
      DrawChaos;
      CloseGraph;
      RestoreCRTMode;
      clrscr;
    end.

[Back to MATH SWAG index] [Back to Main SWAG index] [Original]