home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 079.lha / SpiroGraph / Spirograph.Mod < prev    next >
Encoding:
Text File  |  1986-11-20  |  5.1 KB  |  188 lines

  1. MODULE Spirograph;
  2.  
  3.               (* * * * * * * * * * * * * * * * * * * * * * *)
  4.           (*                                           *)
  5.           (* Spirograph v 1.0                          *)
  6.           (* By Steve Faiwiszewski.                    *)
  7.           (*                                           *)
  8.           (* A silly little program that renders       *)
  9.           (* graphics similar to the Spirograph toy.   *)
  10.           (*                                           *)
  11.           (* This was coded for the Oxxi M2 compiler,  *)
  12.           (* but porting it to the TDI compiler should *)
  13.           (* be trivial.                               *)
  14.           (*                                           *)
  15.           (* (c) Copyright 1987 by Steve Faiwiszewski. *)
  16.           (* This program may be freely distributed,   *)
  17.           (* but it is not to be sold.                 *)
  18.           (* Please leave this notice intact.          *)
  19.               (* * * * * * * * * * * * * * * * * * * * * * *)
  20.  
  21. FROM SpiroDetails
  22.                IMPORT OpenLibs, CleanUp, OpenMyScreen, OpenMyWindow,
  23.                      Position, PlotTo, EraseScreen, SetColor,
  24.                       AddToAboutText,
  25.               ChangeColorReg, GetMessages;
  26. FROM SYSTEM    IMPORT SHIFT, ADR;
  27. FROM MathLib0  IMPORT sin, cos, pi, real;
  28. FROM RandomNumbers
  29.                IMPORT Random, Seed;
  30. FROM AmigaDOS  IMPORT DateStamp, DateStampRecord;
  31.  
  32. CONST
  33.     WIDTH = 320;
  34.     HEIGHT = 200;
  35.     OFFSET = 12;
  36.     DEPTH = 3;
  37.     MaxX = WIDTH;
  38.     MaxY = HEIGHT;
  39.  
  40. VAR
  41.    blank : ARRAY[0..1] OF CHAR;
  42.  
  43. PROCEDURE Randomize;
  44. (* Make sure every time we run this program *)
  45. (* we begin with a different seed.          *)
  46. VAR
  47.     Now : DateStampRecord;
  48. BEGIN
  49.     DateStamp(Now);
  50.     Seed := Now.dsTick;
  51. END Randomize;
  52.  
  53. PROCEDURE MyRandom(n : CARDINAL): REAL;
  54. (* Routine to generate random numbers of type REAL *)
  55. (* with some fractional value, similar to the RND  *)
  56. (* function of most BASICs                         *)
  57. VAR
  58.     b,c : CARDINAL;
  59.     a,r : REAL;
  60. BEGIN
  61.     a := FLOAT(CARDINAL(Random(n)));
  62.     REPEAT
  63.         b := Random(1000);
  64.         c := Random(1000);
  65.     UNTIL (b > 0) OR (c > 0);
  66.     IF b > c THEN
  67.         r := FLOAT(c)/FLOAT(b)
  68.     ELSE
  69.         r := FLOAT(b)/FLOAT(c)
  70.     END;
  71.     IF (a + r) > FLOAT(n) THEN
  72.         RETURN (a + r - 1.0)
  73.     ELSE
  74.         RETURN (a + r)
  75.     END;
  76. END MyRandom;
  77.  
  78. PROCEDURE RandomlyGenerateParameters(VAR m,n,stepa : REAL);
  79. BEGIN
  80.     m := MyRandom(30)+3.0;
  81.     n := MyRandom(TRUNC(m)) + 1.0;
  82.     stepa := MyRandom(1) + 0.01;
  83. END RandomlyGenerateParameters;
  84.  
  85. PROCEDURE DoSpiro;
  86. CONST
  87.     y1 = (MaxY DIV 2) + (OFFSET DIV 2);
  88.     x1 = MaxX DIV 2;
  89. VAR
  90.     MaxColors : CARDINAL;
  91.     Oldm,
  92.     Oldn,
  93.     Oldstepa,
  94.     r,a,m,n,
  95.     stepa   : REAL;
  96.     Done,
  97.     Prev,
  98.     NextPattern,
  99.     PrevPattern,
  100.     LimitedCount,
  101.     first : BOOLEAN;
  102.  
  103. (* If option 'Prev Pattern' gets selected, then the same *)
  104. (* pattern will continually be rendered until option     *)
  105. (* 'Next Pattern' is selected                            *)
  106. PROCEDURE MessWithScreenColors;
  107. VAR
  108.     NextColorReg,
  109.     red, green,blue : CARDINAL;
  110. BEGIN
  111.     NextColorReg := CARDINAL(Random(MaxColors - 1)) + 1;
  112.     SetColor(NextColorReg);
  113.     NextColorReg := CARDINAL(Random(MaxColors - 2)) + 1;
  114.     REPEAT
  115.     red := Random(16);
  116.     green := Random(16);
  117.     blue := Random(16);
  118.     UNTIL (red > 0) OR (green > 0) OR (blue > 0);
  119.     ChangeColorReg(NextColorReg,red,green,blue);
  120. END MessWithScreenColors;
  121.  
  122. BEGIN
  123.     Done := FALSE;
  124.     LimitedCount := TRUE;
  125.     PrevPattern := FALSE;
  126.     NextPattern := FALSE;
  127.     MaxColors := SHIFT(2,DEPTH-1);
  128.     RandomlyGenerateParameters(m,n,stepa);
  129.     REPEAT
  130.         EraseScreen(0,WIDTH,HEIGHT);
  131.     MessWithScreenColors;
  132.         a:=0.0;
  133.     IF NextPattern THEN PrevPattern := FALSE END;
  134.     IF PrevPattern THEN
  135.         m := Oldm;
  136.         n := Oldn;
  137.         stepa := Oldstepa;
  138.         LimitedCount := FALSE;
  139.     ELSE
  140.         Oldm := m;
  141.         Oldn := n;
  142.         Oldstepa := stepa;
  143.         RandomlyGenerateParameters(m,n,stepa);
  144.         LimitedCount := TRUE;
  145.     END;
  146.         first:=TRUE;
  147.         REPEAT
  148.             r:=sin((m/n)*a)*FLOAT(y1-OFFSET);
  149.         IF first THEN
  150.            Position(TRUNC(FLOAT(x1)+r*sin(a)),TRUNC(FLOAT(y1)+r*cos(a)))
  151.         ELSE
  152.            PlotTo(TRUNC(FLOAT(x1)+r*sin(a)),TRUNC(FLOAT(y1)+r*cos(a)));
  153.         END;
  154.             first:=FALSE;
  155.         a:=a+stepa;
  156.         GetMessages(Done,NextPattern,Prev);
  157.         PrevPattern := Prev;
  158.          UNTIL ((a>256.0) AND LimitedCount) OR
  159.                Done OR NextPattern OR Prev;
  160.     UNTIL Done;
  161. END DoSpiro;
  162.  
  163. PROCEDURE SetUpAbout;
  164. BEGIN
  165.     blank := ' ';
  166.     AddToAboutText(ADR('         Spirograph V1.0'));
  167.     AddToAboutText(ADR(blank));
  168.     AddToAboutText(ADR('        Written in Modula-2'));
  169.     AddToAboutText(ADR(blank));
  170.     AddToAboutText(ADR(' Using the Oxxi Benchmark Package'));
  171.     AddToAboutText(ADR(blank));
  172.     AddToAboutText(ADR('       ---------------------'));
  173.     AddToAboutText(ADR(blank));
  174.     AddToAboutText(ADR('        © Copyright 1987 By'));
  175.     AddToAboutText(ADR(blank));
  176.     AddToAboutText(ADR('        Steve Faiwiszewski'));
  177. END SetUpAbout;
  178.  
  179. BEGIN
  180.     OpenLibs;
  181.     OpenMyScreen(WIDTH,HEIGHT,DEPTH);
  182.     OpenMyWindow(WIDTH,HEIGHT,DEPTH);
  183.     SetUpAbout;
  184.     Randomize;
  185.     DoSpiro;
  186.     CleanUp('Spirograph Exited.',99);
  187. END Spirograph.
  188.