home *** CD-ROM | disk | FTP | other *** search
- MODULE ckurve2; (* Kronseder 15.12.84 *)
-
- FROM SYSTEM IMPORT CODE;
- FROM Terminal IMPORT WriteString, Read, WriteLn;
- FROM InTerminal IMPORT ReadC, InDone, InEsc;
- FROM QuickDraw IMPORT MoveTo,LineTo,
- Rect,GrafPtr,EraseRect,GetPort;
- VAR xpos, ypos, dummy: INTEGER;
- angle: CARDINAL;
- length: CARDINAL;
- Figur: CHAR; (* C = Buchstabe C, D = Drache *)
- xmin, xmax, ymin, ymax: INTEGER;
-
- CONST delta = 2;
- TYPE PlaceTypes = (right, left);
- VAR RunMode : (FindMax, DrawIt);
-
- PROCEDURE InqDisplayPosition (VAR origx,origy,sizex,sizey:INTEGER);
- BEGIN origx:=0; origy:=0;
- sizex:=512; sizey:=342;
- END InqDisplayPosition ;
-
- PROCEDURE ClearScreen;
- VAR thePort:GrafPtr; theRect:Rect;
- BEGIN GetPort(thePort); EraseRect(thePort^.portRect); MoveTo(0,0);
- END ClearScreen;
-
- (*$S-*)
- PROCEDURE CBase(length: CARDINAL; angle : CARDINAL; place: PlaceTypes);
- BEGIN
- IF length=0 THEN
- CASE angle OF
- 0,1: xpos := xpos+delta;
- |4,5: xpos := xpos-delta;
- |2,3: ypos := ypos-delta;
- |6,7: ypos := ypos+delta;
- END;
- IF RunMode = FindMax THEN
- IF xpos<xmin THEN xmin := xpos
- ELSIF xpos > xmax THEN xmax := xpos END;
- IF ypos < ymin THEN ymin := ypos
- ELSIF ypos > ymax THEN ymax := ypos END
- ELSE (* RunMode = DrawIt*)
- LineTo (xpos, ypos)
- END
- ELSIF (place = right) OR (Figur = 'C') THEN
- CBase (length -1, (angle+1) MOD 8, right);
- CBase (length -1, (angle+7) MOD 8, left);
- ELSE (* place = left, and Figur = 'D' *)
- CBase (length-1, (angle+7) MOD 8, right);
- CBase (length-1, (angle+1) MOD 8, left)
- END;
- END CBase;
- (*$S+*)
-
- BEGIN
-
- ClearScreen; MoveTo(0,20);
- WriteString(' *************************************'); WriteLn;
- WriteString(' *** MODULA-Programm CKurve2.MOD ***'); WriteLn;
- WriteString(' *************************************'); WriteLn;
-
- LOOP
- MoveTo(5,300);
- LOOP
- WriteString (' Rekursionstiefe (range 1..16 / 0=EXIT ): ');
- ReadC (length); IF InDone OR InEsc THEN EXIT END;
- WriteString (' ungueltige Zahl..'); WriteLn;
- END;
- IF InEsc OR (length = 0) THEN EXIT END;
-
- REPEAT
- WriteString (' C-Kurve oder Drachenkurve ? '); WriteLn; WriteString(' C/D :');
- Read (Figur); Figur := CAP (Figur);
- UNTIL ((Figur='C') OR (Figur='D')) OR (Figur = '0');
- IF (Figur='0' )THEN EXIT END;
-
- ClearScreen;
- xmax := 0; xmin := 0; ymax := 0; ymin := 0;
- xpos := 0; ypos := 0;
- RunMode := FindMax;
- CBase (length, 0, right);
- InqDisplayPosition (dummy, dummy, xpos, ypos);
- IF xmax-xmin < xpos
- THEN (* es hat Platz *) xpos := 0 + xpos DIV 2 - (xmin + xmax) DIV 2
- ELSE xpos := - xmin
- END;
- IF ymax - ymin < ypos
- THEN ypos := 0 + ypos DIV 2 - (ymin + ymax) DIV 2
- ELSE ypos := - ymin
- END;
- MoveTo (xpos, ypos); RunMode := DrawIt; CBase (length, 0,right);
- END; (* loop *)
- END ckurve2.
- (*================================================================*)
-
-
-
-