home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / IFS.Mod (.txt) < prev    next >
Oberon Text  |  2000-02-29  |  3KB  |  67 lines

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. Syntax10b.Scn.Fnt
  4. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  5. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  6. MODULE IFS; (** portable *)
  7. (* Iterated Function System, page 92 *)
  8. IMPORT RandomNumbers, In, Out, XYplane;
  9.     a1, b1, c1, d1, e1, f1, p1: REAL; (* IFS parameters *)
  10.     a2, b2, c2, d2, e2, f2, p2: REAL; (* IFS parameters *)
  11.     a3, b3, c3, d3, e3, f3, p3: REAL; (* IFS parameters *)
  12.     a4, b4, c4, d4, e4, f4, p4: REAL; (* IFS parameters *)
  13.     X, Y: REAL;        (* the position of the pen *)
  14.     x0: INTEGER;    (* Distance of origin fm left edge[pixels] *)
  15.     y0: INTEGER;    (* Distance of origin from bottom edge[pixels] *)
  16.     e: INTEGER;    (* Size of unit interval [pixels] *)
  17.     initialized: BOOLEAN;    (* Are parameters initialized? *)
  18. PROCEDURE Draw*;    (* command marked for export *)
  19.     x, y: REAL; (* new position *)
  20.     xi, eta: INTEGER; (* pixel coordinates of pen *)
  21.     rn: REAL;
  22. BEGIN
  23. IF initialized THEN
  24.     REPEAT
  25.         rn := RandomNumbers.Uniform();
  26.         IF rn < p1 THEN
  27.             x := a1 * X + b1 * Y + e1;    y := c1 * X + d1 * Y + f1
  28.         ELSIF rn < (p1 + p2) THEN
  29.             x := a2 * X + b2 * Y + e2;    y := c2 * X + d2 * Y + f2
  30.         ELSIF rn < (p1 + p2 + p3) THEN
  31.             x := a3 * X + b3 * Y + e3;    y := c3 * X + d3 * Y + f3
  32.         ELSE
  33.             x := a4 * X + b4 * Y + e4;    y := c4 * X + d4 * Y + f4
  34.         END;
  35.         X := x; xi := x0 + SHORT(ENTIER(X*e));
  36.         Y := y; eta := y0 + SHORT(ENTIER(Y*e));
  37.         XYplane.Dot(xi, eta, XYplane.draw)
  38.     UNTIL "s" = XYplane.Key()
  39. END Draw;
  40. PROCEDURE Init*;    (* command marked for export *)
  41. BEGIN
  42.     X := 0; Y := 0; (* Initial position of pen *)
  43.     initialized := FALSE;
  44.     In.Open;
  45.     In.Int(x0); In.Int(y0); In.Int(e);
  46.     In.Real(a1); In.Real(a2); In.Real(a3); In.Real(a4);
  47.     In.Real(b1); In.Real(b2); In.Real(b3); In.Real(b4);
  48.     In.Real(c1); In.Real(c2); In.Real(c3); In.Real(c4);
  49.     In.Real(d1); In.Real(d2); In.Real(d3); In.Real(d4);
  50.     In.Real(e1); In.Real(e2); In.Real(e3); In.Real(e4);
  51.     In.Real(f1); In.Real(f2); In.Real(f3); In.Real(f4);
  52.     In.Real(p1); In.Real(p2); In.Real(p3); In.Real(p4);
  53.     IF In.Done THEN XYplane.Open; initialized := TRUE
  54.     ELSE Out.String("Parameter error"); Out.Ln
  55. END Init;
  56. BEGIN initialized := FALSE
  57. END IFS. (* Copyright M. Reiser, 1992 *)
  58. IFS.Init 200 50 40
  59. 0.0 0.85 0.2 -0.15
  60. 0.0 0.04 -0.26 0.28
  61. 0.0 -0.04 0.23 0.26
  62. 0.16 0.85 0.22 0.24
  63. 0.0 0.0 0.0 0.0 
  64. 0.0 1.6 1.6 0.44
  65. 0.01 0.85 0.07 0.07 ~
  66. IFS.Draw
  67.