home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* WUERFEL.PAS *)
- (* Das Listing »Wuerfel.PAS« zeigt Ihnen, wie man *)
- (* »CGAPage« zur Programmierung einfacher Animationen *)
- (* verwenden kann. *)
- (* Es zeichnet einen sich drehenden Würfel in der be- *)
- (* kannten Rot-Grün-Darstellung auf dem Bildschirm. *)
- (* (c) 1991 Hanno-Ekkehard Müller & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Wuerfel2;
-
- USES Crt, Graph, CGAPage;
-
- {$IFOPT N+}
- TYPE
- REAL = EXTENDED;
- {$ENDIF}
-
- CONST
- Zeile = 'DDD by HEM';
- Kante : ARRAY [1..12, 1..2] OF BYTE =
- ((1,2),(2,3),(3,4),(4,1),
- (5,6),(6,7),(7,8),(8,5),
- (1,5),(2,6),(3,7),(4,8));
- EckeX : ARRAY [1..2, 1..8] OF REAL =
- ((-1, 1, 1,-1,-1, 1, 1,-1),
- ( 0, 0, 0, 0, 0, 0, 0, 0));
- EckeY : ARRAY [1..2, 1..8] OF REAL =
- (( 1, 1,-1,-1, 1, 1,-1,-1),
- ( 0, 0, 0, 0, 0, 0, 0, 0));
- EckeZ : ARRAY[1..2, 1..8] OF REAL =
- ((-1,-1,-1,-1, 1, 1, 1, 1),
- ( 0, 0, 0, 0, 0, 0, 0, 0));
- VAR
- gd, gm, i, j,
- Achse,
- Zaehler : INTEGER;
- Bild : ARRAY [1..2] OF Pointer;
- x1, y1, z1,
- sind, cosd,
- sina, cosa : REAL;
- px, py : ARRAY [1..8] OF INTEGER;
-
- PROCEDURE CGADriverProc; EXTERNAL; {$L CGA}
- { Wird für InitCGAPage benötigt }
- BEGIN
- gd := cga;
- gm := cgac2; { Grün, Rot & Gelb - ideal... }
-
- i := RegisterBGIdriver(@CGADriverProc);
- InitGraph(gd, gm, '');
-
- InitCGAPage(1, @CGADriverProc);
- UsePage(1);
-
- Randomize;
- Zaehler := 0;
-
- { Winkel einer Drehung: 1.5 Grad }
- sina := Sin(1.5*Pi/180);
- cosa := Cos(1.5*Pi/180);
- { Winkel für Rot-Grün-Drehung: 1 Grad }
- sind := Sin(1*Pi/180);
- cosd := Cos(1*Pi/180);
-
- FOR i := 1 TO 2 DO BEGIN
- { Textzeile in zwei Farben }
- SetColor(i);
- OutTextXY(0, 0, Zeile);
- GetMem(Bild[i], ImageSize(0, 0,
- TextWidth(Zeile), TextHeight(Zeile)));
- GetImage(0, 0, TextWidth(Zeile),
- TextHeight(Zeile),Bild[i]^);
- END;
-
- {$IFNDEF VER40}
- SetWriteMode(XORput);
- {$ENDIF}
-
- REPEAT
- ClearPage(1);
- Dec(Zaehler);
- IF Zaehler < 0 THEN BEGIN
- Achse := Random(3);
- Zaehler := Random(50);
- IF BOOLEAN(Random(2)) THEN
- sina := -sina;
- END;
- CASE Achse OF
- { Drehung des Körpers }
- 0 : FOR i := 1 TO 8 DO BEGIN
- x1 := EckeX[1, i] * cosa + EckeY[1, i] * sina;
- y1 := EckeY[1, i] * cosa - EckeX[1, i] * sina;
- EckeX[1, i] := x1;
- EckeY[1, i] := y1;
- END;
- 1 : FOR i := 1 TO 8 DO BEGIN
- y1 := EckeY[1, i] * cosa + EckeZ[1, i] * sina;
- z1 := EckeZ[1, i] * cosa - EckeY[1, i] * sina;
- EckeY[1, i] := y1;
- EckeZ[1, i] := z1;
- END;
- 2 : FOR i := 1 TO 8 DO BEGIN
- z1 := EckeZ[1, i] * cosa + EckeX[1, i] * sina;
- x1 := EckeX[1, i] * cosa - EckeZ[1, i] * sina;
- EckeZ[1, i] := z1;
- EckeX[1, i] := x1;
- END;
- END;
-
- FOR i := 1 TO 8 DO BEGIN
- { Rot-Grün-Drehung }
- EckeZ[2, i] := 4 + (EckeZ[1, i] - 4) * cosd +
- EckeX[1, i] * sind;
- EckeX[2, i] := EckeX[1, i] * cosd -
- (EckeZ[1, i] - 4) * sind;
- EckeY[2, i] := EckeY[1, i];
- END;
-
- FOR i := 1 TO 2 DO BEGIN
- { Darstellung des Körpers }
- SetColor(i);
- PutImage(i*3, 0, Bild[i]^, XORput);
- FOR j := 1 TO 8 DO BEGIN
- px[j] := 160+Round(200*EckeX[i,j]/(EckeZ[i,j]+4));
- py[j] := 100-Round(200*EckeY[i,j]/(EckeZ[i,j]+4));
- END;
- FOR j := 1 TO 12 DO
- Line(px[Kante[j,1]],py[Kante[j,1]],
- px[Kante[j,2]],py[Kante[j,2]]);
- END;
- ShowPage(1);
- UNTIL KeyPressed;
-
- ReInitCGAPage;
- CloseGraph;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von WUERFEL.PAS *)