home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / lang / mod2.hqx / m2-2.pit / CKurve2.MOD < prev    next >
Encoding:
Text File  |  1985-02-21  |  2.8 KB  |  99 lines

  1. MODULE ckurve2;      (*   Kronseder 15.12.84 *)
  2.  
  3. FROM SYSTEM IMPORT CODE;
  4. FROM Terminal IMPORT WriteString, Read, WriteLn;
  5. FROM InTerminal IMPORT ReadC, InDone, InEsc;
  6. FROM QuickDraw IMPORT MoveTo,LineTo,
  7.      Rect,GrafPtr,EraseRect,GetPort;
  8. VAR xpos, ypos, dummy: INTEGER;
  9.   angle: CARDINAL;
  10.   length: CARDINAL;
  11.   Figur: CHAR;   (* C = Buchstabe C, D = Drache *)
  12.   xmin, xmax, ymin, ymax: INTEGER;
  13.  
  14. CONST delta = 2;
  15. TYPE PlaceTypes = (right, left);
  16. VAR  RunMode :  (FindMax, DrawIt);
  17.  
  18. PROCEDURE InqDisplayPosition (VAR origx,origy,sizex,sizey:INTEGER);
  19.  BEGIN origx:=0; origy:=0;
  20.        sizex:=512; sizey:=342; 
  21.  END InqDisplayPosition ;
  22.  
  23. PROCEDURE ClearScreen;
  24.  VAR thePort:GrafPtr; theRect:Rect;
  25.  BEGIN GetPort(thePort); EraseRect(thePort^.portRect); MoveTo(0,0);
  26.  END ClearScreen;
  27.  
  28. (*$S-*)
  29. PROCEDURE CBase(length: CARDINAL; angle : CARDINAL; place: PlaceTypes);
  30. BEGIN
  31.   IF length=0 THEN
  32.     CASE angle OF
  33.   0,1: xpos := xpos+delta;
  34.  |4,5: xpos := xpos-delta;
  35.  |2,3: ypos := ypos-delta;
  36.  |6,7: ypos := ypos+delta;
  37.     END;
  38.     IF RunMode = FindMax THEN
  39.       IF xpos<xmin THEN xmin := xpos
  40.       ELSIF xpos > xmax THEN xmax := xpos END;
  41.       IF ypos < ymin THEN ymin := ypos
  42.       ELSIF ypos > ymax THEN ymax := ypos END
  43.     ELSE (* RunMode = DrawIt*)
  44.       LineTo (xpos, ypos)
  45.     END
  46.   ELSIF (place = right) OR (Figur = 'C') THEN
  47.     CBase (length -1, (angle+1) MOD 8, right);
  48.     CBase (length -1, (angle+7) MOD 8, left);
  49.   ELSE (* place = left, and Figur = 'D' *)
  50.     CBase (length-1, (angle+7) MOD 8, right);
  51.     CBase (length-1, (angle+1) MOD 8, left)
  52.   END;
  53. END CBase;
  54. (*$S+*)
  55.  
  56. BEGIN
  57.  
  58.   ClearScreen; MoveTo(0,20);
  59.   WriteString(' *************************************'); WriteLn;
  60.   WriteString(' ***  MODULA-Programm  CKurve2.MOD ***'); WriteLn;
  61.   WriteString(' *************************************'); WriteLn;
  62.  
  63.  LOOP
  64.   MoveTo(5,300);
  65.   LOOP
  66.     WriteString (' Rekursionstiefe (range 1..16 / 0=EXIT ): ');
  67.     ReadC (length); IF InDone OR InEsc THEN EXIT END;
  68.     WriteString (' ungueltige Zahl..'); WriteLn;
  69.   END;
  70.   IF InEsc OR (length = 0) THEN EXIT END;
  71.  
  72.   REPEAT
  73.    WriteString (' C-Kurve oder Drachenkurve ?  '); WriteLn; WriteString(' C/D :');
  74.    Read (Figur); Figur := CAP (Figur);
  75.   UNTIL ((Figur='C') OR (Figur='D')) OR (Figur = '0');
  76.    IF (Figur='0' )THEN EXIT END;
  77.  
  78.   ClearScreen;
  79.   xmax := 0; xmin := 0; ymax := 0; ymin := 0;
  80.   xpos := 0; ypos := 0;
  81.   RunMode :=  FindMax;
  82.   CBase (length, 0, right);
  83.   InqDisplayPosition (dummy, dummy, xpos, ypos);
  84.   IF xmax-xmin < xpos 
  85.    THEN (* es hat Platz *)    xpos := 0 + xpos DIV 2  - (xmin + xmax) DIV 2
  86.    ELSE                       xpos := - xmin
  87.   END;
  88.   IF ymax - ymin < ypos 
  89.    THEN   ypos := 0 + ypos DIV 2 - (ymin + ymax) DIV 2
  90.    ELSE   ypos := - ymin
  91.   END;
  92.   MoveTo (xpos, ypos);  RunMode := DrawIt;  CBase (length, 0,right);
  93.  END; (* loop *)
  94. END ckurve2.
  95. (*================================================================*)
  96.  
  97.  
  98.  
  99.