``````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

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 = '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,':  ');
val (instr, inval, err);
if (err > 0) or (inval > max) then
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
repeat
select := random(3) + 1;
TriExt.x := TriExt.x + (TriExt[select].x - TriExt.x) div 2;
TriExt.y := TriExt.y + (TriExt[select].y - TriExt.y) div 2;
putpixel (TriExt.x, TriExt.y, 15);
until keypressed;
end;

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

``````