PROGRAM ARTSQUARES(INPUT/,OUTPUT); (**********) (* ARTSQUARES - A. H. J. SALE 1978/10/18. *) (* DEPT. OF INFORMATION SCIENCE *) (* UNIVERSITY OF TASMANIA *) (* HOBART, TASMANIA 7001 *) (* AUSTRALIA *) (* *) (* COPYRIGHT (C) 1978. *) (* ARTSQUARES WAS WRITTEN TO ILLUSTRATE THAT PASCAL'S EXPRESSIVENESS *) (* PROVIDES A NATURAL SOLUTION TO THIS PROBLEM. THE PROGRAM PRODUCES *) (* TESSELATION PATTERNS BY ROTATING AND REFLECTING A SQUARE CELL--NOT A *) (* DIFFICULT PROBLEM. *) (* *) (* THE "FUN PART" IS THAT YOU CAN CHANGE THE PATTERNS VERY EASILY; *) (* OTHER VERSIONS SELECT RANDOMLY BETWEEN SEVERAL PATTERNS. THE "PROOF *) (* PART" COMES IN A CHALLENGE: REWRITE THE PROGRAM INTO YOUR FAVOURITE *) (* LANGUAGE. WHILE DOING IT, KEEP COUNT OF THE NUMBER OF TIMES YOU HAVE *) (* DISTORT AN IDEA INTO YOUR LANGUAGE'S MOULD. AFTER COMPLETING IT, ASK *) (* YOURSELF IF THE RESULT IS AS PLEASING OR EASY TO UNDERSTAND. *) (* *) (* IDEAS FOR FUN: *) (* -------------- *) (* 1) CHANGE THE (X MOD 4) PROCEDURE PARAMETER, WHICH PRODUCES A BASIC *) (* WAVY PATTERN BY ROTATING THE SQUARE, TO 0 WHICH WILL PRODUCE A BASIC *) (* DIAGONAL-STRIPE PATTERN. *) (* *) (* 2) USE A DIFFERENT PATTERN BY CHANGING THE INITIALIZATION OF "SQ". *) (* *) (* 3) USE A DIFFERENT SIZE SQUARE BY MODIFYING THE CONSTANTS "SIDE" AND *) (* "CHARSPERLINE", AND THE INITIALIZATION OF "SQ". *) (* *) (* 4) MAKE "SQ" AN "ARRAY OF SQUAREKIND" AND SELECT DIFFERENT SQUARES *) (* RANDOMLY, POSSIBLY WITH MIXED-UP ROTATIONS AND REFLECTIONS. *) CONST SIDE = 5; (* SIDE OF SQUARE PATTERN *) CHARSPERLINE = 130; (* MULTIPLE OF SIDE *) LINESPERPAGE = 60; TYPE SIDESIZE = 1 .. SIDE; SQUAREKIND = ARRAY[SIDESIZE] OF PACKED ARRAY[SIDESIZE] OF CHAR; LINESIZE = 1 .. CHARSPERLINE; PAGESIZE = 1 .. LINESPERPAGE; ROTATION = 0 .. 3; (* IN 90-DEGREE STEPS *) VAR SQ : SQUAREKIND; STRIP : ARRAY[SIDESIZE] OF PACKED ARRAY[LINESIZE] OF CHAR; W : SIDESIZE; X : LINESIZE; Y : PAGESIZE; REFL : BOOLEAN; (* REFLECTED ABOUT Y-AXIS *) SEED : REAL; (* STARTS OFF RANDOMIZER *) PROBABILITY : REAL; (* USED TO RANDOMIZE *) FUNCTION RAN: REAL; EXTERN; (***) PROCEDURE SETRAN(SEED: REAL); EXTERN; (******) PROCEDURE PLOTASQUARE (***********) (SQUARE : SQUAREKIND; (* TO BE PLOTTED *) XMOVE : LINESIZE; (* THIS FAR ALONG *) ROTATED : ROTATION; (* MULTIPLE OF 90 DEGREES *) REFLECT : BOOLEAN); (* ABOUT Y IF TRUE *) VAR EXCH,REVX,REVY : BOOLEAN; (* HOW TO SCAN SQUARE *) XA,YA,XP,YP : SIDESIZE; (* INDEXES *) BEGIN (* ARE X,Y REVERSED OR EXCHANGED? *) REVX := REFLECT; CASE ROTATED OF 0: BEGIN EXCH := FALSE; REVY := FALSE END; 1: BEGIN EXCH := TRUE; REVY := FALSE; REVX := NOT REVX END; 2: BEGIN EXCH := FALSE; REVY := TRUE; REVX := NOT REVX END; 3: BEGIN EXCH := TRUE; REVY := TRUE END; END; (* PLOT THE SQUARE ONTO THE STRIP *) FOR YA := 1 TO SIDE DO BEGIN IF REVY THEN YP := SIDE - YA + 1 ELSE YP := YA; FOR XA := 1 TO SIDE DO BEGIN IF REVX THEN XP := SIDE - XA + 1 ELSE XP := XA; IF EXCH THEN BEGIN STRIP[XP,XMOVE+YP-1] := SQUARE[YA,XA]; END ELSE BEGIN STRIP[YP,XMOVE+XP-1] := SQUARE[YA,XA]; END; END; END; END; (* OF PLOT-A-SQUARE *) BEGIN (* OF ART-SQUARES *) (* SET UP RANDOMIZER *) SEED := 12.03; SETRAN(SEED); (* SET UP A SQUARE PATTERN FOR EXAMPLE *) SQ[1] := ' X '; SQ[2] := ' X '; SQ[3] := 'X X'; SQ[4] := ' X '; SQ[5] := ' X '; (* REPEATEDLY MAKE A PICTURE UNTIL END OF FILE INPUT IS REACHED *) WHILE NOT EOF(INPUT) DO BEGIN (* READ IN DATA TO AFFECT PICTURE *) WRITELN('ENTER A PROBABILITY BETWEEN 0 AND 1 TO AFFECT PICTURE.'); READ(INPUT, PROBABILITY); IF (PROBABILITY < 0.0) OR (PROBABILITY > 1.0) THEN HALT; PAGE(OUTPUT); (* TO TOP OF SCREEN OR PAGE *) (* LOOP TO CONSTRUCT AND WRITE STRIPS *) FOR Y := 1 TO (LINESPERPAGE DIV SIDE) DO BEGIN (* CONSTRUCT A STRIP *) FOR X := 1 TO (CHARSPERLINE DIV SIDE) DO BEGIN (* PLOT A SQUARE *) REFL := (RAN < PROBABILITY); PLOTASQUARE(SQ,((X-1)*SIDE+1),(X MOD 4), REFL); END; (* WRITE A STRIP *) FOR W := 1 TO SIDE DO BEGIN WRITELN(OUTPUT, STRIP[W]); END; END; (* OF Y-LOOP TO PRINT A PAGE *) END; (* OF PROBABILITY-READING LOOP *) END (* OF ART-SQUARES *). :