**[**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**]**