PROGRAM PLOTWUERFEL(INPUT,OUTPUT); CONST UP="H"; DOWN="I"; TYPE PUNKT = RECORD X,Y,Z: REAL; SICHTBAR: BOOLEAN END; VAR BILD: INTEGER; ALFA, BETA, GAMMA, OX, OZ, AXX, AXY, AXZ, AYX, AYY, AYZ, AZX, AZY, AZZ: REAL; WUERFEL: ARRAY["A".."H"] OF PUNKT; FLAECHE: ARRAY[1..6,1..4] OF CHAR; WEG: ARRAY[1..16] OF CHAR; PENXPOS,PENYPOS: INTEGER; (********** P L O T T E R PROZEDUREN **********) PROCEDURE PEN(I:CHAR); BEGIN WRITE(I) END; PROCEDURE SEND(IX,IY: INTEGER); BEGIN IF IX>=0 THEN WRITE( IX:1,"@") ELSE WRITE(-IX:1,"P"); IF IY>=0 THEN WRITE( IY:1,"A") ELSE WRITE(-IY:1,"Q") END; PROCEDURE MOVE(X,Y: REAL); BEGIN PENXPOS:=ROUND(X); PENYPOS:=ROUND(Y); WRITE("H"); SEND(PENXPOS,PENYPOS); WRITELN("K") END; PROCEDURE LINE(X,Y: REAL); VAR DX,DY: INTEGER; BEGIN DX:=ROUND(X)-PENXPOS; DY:=ROUND(Y)-PENYPOS; SEND(DX,DY); WRITELN("J"); PENXPOS:=PENXPOS+DX; PENYPOS:=PENYPOS+DY END; PROCEDURE DOTS(X,Y: REAL); CONST DIST=30.0; VAR U,V,DX,DY,L,SX,SY: REAL; BEGIN U:=PENXPOS; V:=PENYPOS; DX:=X-U; DY:=Y-V; L:=SQRT(DX*DX + DY*DY); IF L>0 THEN BEGIN SX:=DX/L*DIST; SY:=DY/L*DIST; WHILE L>DIST DO BEGIN U:=U+SX; V:=V+SY; L:=L-DIST; MOVE(U,V); PEN(DOWN) END; MOVE(X,Y); PEN(DOWN) END END; PROCEDURE BLATTWECHSEL; BEGIN PEN(UP); WRITELN(" ":384) END; (***********************************************) PROCEDURE ROTATIONSMATRIX; CONST RAD=1.745329252E-2; VAR SINA,COSA,SINB,COSB,SINC,COSC: REAL; BEGIN SINA := SIN(ALFA*RAD); COSA := COS(ALFA*RAD); SINB := SIN(BETA*RAD); COSB := COS(BETA*RAD); SINC := SIN(GAMMA*RAD); COSC := COS(GAMMA*RAD); AXX := COSB*COSC; AXY := COSB*SINC; AXZ := -SINB; AYX := SINA*SINB*COSC - COSA*SINC; AYY := SINA*SINB*SINC + COSA*COSC; AYZ := SINA*COSB; AZX := COSA*SINB*COSC + SINA*SINC; AZY := COSA*SINB*SINC - SINA*COSC; AZZ := COSA*COSB; END (* ROTATIONSMATRIX *); PROCEDURE WUERFELBESCHREIBUNG; CONST H=250.0; VAR I: INTEGER; BEGIN FLAECHE[1,1] := "A"; FLAECHE[1,2] := "B"; FLAECHE[1,3] := "F"; FLAECHE[1,4] := "E"; FLAECHE[2,1] := "C"; FLAECHE[2,2] := "D"; FLAECHE[2,3] := "H"; FLAECHE[2,4] := "G"; FLAECHE[3,1] := "B"; FLAECHE[3,2] := "C"; FLAECHE[3,3] := "G"; FLAECHE[3,4] := "F"; FLAECHE[4,1] := "D"; FLAECHE[4,2] := "A"; FLAECHE[4,3] := "E"; FLAECHE[4,4] := "H"; FLAECHE[5,1] := "E"; FLAECHE[5,2] := "F"; FLAECHE[5,3] := "G"; FLAECHE[5,4] := "H"; FLAECHE[6,1] := "A"; FLAECHE[6,2] := "B"; FLAECHE[6,3] := "C"; FLAECHE[6,4] := "D"; FOR I := 1 TO 4 DO BEGIN WUERFEL[ FLAECHE[1,I] ].X := H; WUERFEL[ FLAECHE[2,I] ].X := -H; WUERFEL[ FLAECHE[3,I] ].Y := H; WUERFEL[ FLAECHE[4,I] ].Y := -H; WUERFEL[ FLAECHE[5,I] ].Z := H; WUERFEL[ FLAECHE[6,I] ].Z := -H END; WEG[1] := "A"; WEG[2] := "B"; WEG[3] := "C"; WEG[4] := "D"; WEG[5] := "A"; WEG[6] := "E"; WEG[7] := "F"; WEG[8] := "G"; WEG[9] := "H"; WEG[10]:= "E"; WEG[11]:= "F"; WEG[12]:= "B"; WEG[13]:= "C"; WEG[14]:= "G"; WEG[15]:= "H"; WEG[16]:= "D" (* WEGE ZU 1, 11, 13 U. 15 SIND KEINE KANTEN! *) END (* WUERFELBESCHREIBUNG *); PROCEDURE DREHUNG; VAR ECKE: CHAR; X0,Y0,Z0: REAL; BEGIN FOR ECKE := "A" TO "H" DO BEGIN X0 := WUERFEL[ECKE].X; Y0 := WUERFEL[ECKE].Y; Z0 := WUERFEL[ECKE].Z; WUERFEL[ECKE].X := AXX*X0 + AXY*Y0 + AXZ*Z0; WUERFEL[ECKE].Y := AYX*X0 + AYY*Y0 + AYZ*Z0; WUERFEL[ECKE].Z := AZX*X0 + AZY*Y0 + AZZ*Z0 END END (* DREHUNG *); PROCEDURE ANSICHT; VAR ECKE: CHAR; N,I: INTEGER; BEGIN FOR ECKE := "A" TO "H" DO WUERFEL[ECKE].SICHTBAR := FALSE; FOR N := 1 TO 6 DO IF WUERFEL[ FLAECHE[N,1] ].Y + WUERFEL[ FLAECHE[N,3] ].Y > 0 THEN FOR I := 1 TO 4 DO WUERFEL[ FLAECHE[N,I] ].SICHTBAR := TRUE END (* ANSICHT *); PROCEDURE ZEICHNUNG; VAR VON, NACH: PUNKT; I: INTEGER; BEGIN FOR I := 1 TO 16 DO BEGIN VON := NACH; NACH := WUERFEL[ WEG[I] ]; IF (I=1) OR (I>10) AND ODD(I) THEN BEGIN MOVE(OX-NACH.X,OZ+NACH.Z);PEN(DOWN) END ELSE IF VON.SICHTBAR AND NACH.SICHTBAR THEN LINE(OX-NACH.X,OZ+NACH.Z) ELSE DOTS(OX-NACH.X,OZ+NACH.Z) END END (* ZEICHNUNG *); BEGIN WHILE NOT EOF DO BEGIN READ(ALFA,BETA,GAMMA); ROTATIONSMATRIX; WUERFELBESCHREIBUNG; FOR BILD := 0 TO 11 DO BEGIN OX := 600 + 800*(BILD MOD 4); OZ := 2200 - 800*(BILD DIV 4); DREHUNG; ANSICHT; ZEICHNUNG END; BLATTWECHSEL END END.