home *** CD-ROM | disk | FTP | other *** search
-
- TYPE POINT = STRUCT (REAL x, y);
-
- PROC show point (POINT CONST p):
- move (p.x, p.y);
- plot pixel
- ENDPROC show point;
-
- POINT PROC mid (POINT CONST a, b):
- POINT: [a.x + (b.x - a.x) / 2.0, a.y + (b.y - a.y) / 2.0]
- ENDPROC mid;
-
- PROC line parameters (POINT CONST a1, a2, REAL VAR m, c):
- m := (a1.y - a2.y) / (a1.x - a2.x);
- c := a1.y - m * a1.x
- ENDPROC line parameters;
-
- BOOL PROC inside triangle (POINT CONST a, b, c, x):
- crosspoint on the side (x, a, b, c) AND crosspoint on the side (x, b, c, a) AND crosspoint on the side (x, c, a, b)
- ENDPROC inside triangle;
-
- BOOL PROC crosspoint on the side (POINT CONST p, pc, oc1, oc2):
- POINT VAR cross;
- IF crossing (p, pc, oc1, oc2, cross)
- THEN between (cross.x, oc1.x, oc2.x) AND between (cross.y, oc1.y, oc2.y)
- ELSE FALSE
- FI
- ENDPROC crosspoint on the side;
-
- BOOL PROC crossing (POINT CONST a1, a2, b1, b2, POINT VAR crp):
- REAL VAR ma, ca, mb, cb;
- line parameters (a1, a2, ma, ca);
- line parameters (b1, b2, mb, cb);
- IF ma = mb
- THEN FALSE
- ELSE
- crp.x := (ca - cb) / (mb - ma);
- crp.y := mb * crp.x + cb;
- TRUE
- FI
- ENDPROC crossing;
-
- BOOL PROC between (REAL CONST x, a, b):
- IF a <= b
- THEN a <= x AND x <= b
- ELSE b <= x AND x <= a
- FI
- ENDPROC between;
-
- program:
- POINT VAR a, b, c, x;
- INT VAR i;
- LET iterations = 2000;
- enter turtle graphics;
- print title;
- make triangle;
- choose point;
- FOR i UPTO iterations
- REP
- x := mid (choose random corner, x);
- IF i > 30
- THEN show point (x)
- FI
- ENDREP;
- wait for confirmation (1, graphics y limit - line height);
- leave turtle graphics.
-
- print title:
- move (1, 1);
- put ("Sierpienski triangle");
- line;
- put ("made by a random process").
-
- make triangle:
- a := POINT: [0.0, 0.0];
- b := POINT: [100.0, 0.0];
- c := POINT: [80.0, 100.0].
-
- choose point:
- REP x := POINT: [100.0 * random, 100.0 * random]
- UNTIL inside triangle (a, b, c, x)
- ENDREP.
-
- choose random corner:
- SELECT random (1, 3) OF
- CASE 1: a
- CASE 2: b
- OTHERWISE c
- ENDSELECT.
-