home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* ZYKLOID.PAS *)
- (* Turbo Pascal 5.5 *)
- (* (c) 1990 Alfons Vogel & TOOLBOX *)
- (* ------------------------------------------------------ *)
- USES Graph, Crt;
-
- VAR
- Gd, Gm, LochStep, LochStart,
- LochEnde, X0, Y0, ZRing, ZRad : INTEGER;
- RRing, RRad, WRing, WRad,
- StepRing, StepRad, ZwoPi,
- XStart, YStart, XP, YP : REAL;
- ch : CHAR;
-
- PROCEDURE StartGrafik; { Grafik initialisieren }
- BEGIN
- DetectGraph(Gd, Gm);
- InitGraph(Gd, Gm, '');
- IF GraphResult<>0 THEN BEGIN
- Write(^G, 'Fehler beim Initialisieren der BGI-Grafik!');
- Halt(2);
- END;
- X0 := GetMaxX DIV 2;
- Y0 := GetMaxY DIV 2;
- RRing := GetMaxY DIV 2;
- LochStep := 2;
- END;
-
- PROCEDURE Input; { Eingabe aller Parameter }
- VAR
- ch: CHAR;
- BEGIN
- RestoreCrtMode;
- ClrScr;
- Window(20, 3, 60, 20);
- WriteLn('Z Y K L O I D');
- WriteLn('=============');
- WriteLn;
- WriteLn('(c) 1990 Alfons Vogel & TOOLBOX');
- WriteLn;
- Write('Anzahl Zähne Ring [Ende = 0]: ');
- ReadLn(ZRing);
- IF ZRing = 0 THEN Halt(0);
- Write('Anzahl Zähne Rad : ');
- ReadLn(ZRad);
- Write('Loch-Nr. Start : ');
- ReadLn(LochStart);
- Write('Loch-Nr. Ende : ');
- ReadLn(LochEnde);
- SetGraphMode(Gm);
- END;
-
- PROCEDURE Zeichnen;
- VAR
- AnzStepRing, c, d, x: INTEGER;
- PRadX, PRadY : REAL;
- XAsp, YAsp : WORD;
- RUmX, RUmY : REAL;
- BEGIN
- SetBkColor(0);
- ClearDevice;
- GetAspectRatio(XAsp, YAsp); { Verzerrung ausgleichen }
- RRad := RRing * ZRad / ZRing;
- RUmY := RRing - RRad;
- RUmX := RUmY * YAsp / XAsp;
- AnzStepRing := 5 * ((2 * ZRing) DIV ZRad);
- StepRing := Pi / AnzStepRing; { Winkelschritt im Ring }
- StepRad := -StepRing * (ZRing / ZRad - 1); { Winkel Rad }
- FOR x := LochStart TO LochEnde DO BEGIN
- SetColor(1 + x MOD GetMaxColor);
- PRadY := RRad - LochStep * 2 * x - 8; { Mittelpunkt }
- PRadX := PRadY *YAsp / XAsp; { des Rads }
- IF PRadX < 0 THEN Exit;
- XStart := X0 + RUmX * Sin(0) + PRadX * Sin(0); { Start }
- YStart := Y0 - RUmY * Cos(0) - PRadY * Cos(0);
- MoveTo(Round(XStart), Round(YStart));
- WRing := 0;
- WRad := 0;
- d := 0;
- REPEAT { einzelne Kurve zeichnen }
- FOR c := 1 TO 2 * AnzStepRing DO BEGIN { ein Umlauf }
- Inc(d);
- WRad := StepRad * d; { Winkel Rad }
- WRing := StepRing * c; { Winkel im Ring }
- XP := X0 + RUmX * Sin(WRing) + PRadX * Sin(WRad);
- YP := Y0 - RUmY * Cos(WRing) - PRadY * Cos(WRad);
- LineTo(Round(XP), Round(YP));
- IF KeyPressed THEN BEGIN { Unterbrechung? }
- ch := ReadKey;
- IF ch = #27 THEN BEGIN
- RestoreCrtMode;
- Halt(0);
- END;
- END;
- END;
- UNTIL (Abs(XStart-XP) < 0.01) AND { Startpunkt }
- (Abs(YStart-YP) < 0.01); { erreicht? }
- END;
- Write(^G);
- END;
-
- BEGIN
- ZwoPi := 2 * Pi;
- StartGrafik;
- REPEAT
- Input;
- Zeichnen;
- ch := ReadKey;
- UNTIL ch = #27;
- RestoreCrtMode;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von ZYKLOID.PAS *)
-