| 1 | PROGRAM PLOTDODEKAEDER(INPUT,OUTPUT); |
| 2 | |
| 3 | CONST UP="H"; DOWN="I"; |
| 4 | |
| 5 | TYPE PUNKT = RECORD X,Y,Z: REAL; SICHTBAR: BOOLEAN END; |
| 6 | |
| 7 | VAR BILD: INTEGER; |
| 8 | ALFA, BETA, GAMMA, OX, OZ, |
| 9 | AXX, AXY, AXZ, AYX, AYY, AYZ, AZX, AZY, AZZ: REAL; |
| 10 | DODEKA: ARRAY[1..20] OF PUNKT; |
| 11 | FLAECHE: ARRAY[1..12,1..5] OF INTEGER; |
| 12 | WEG: ARRAY[1..40] OF INTEGER; |
| 13 | |
| 14 | PENXPOS,PENYPOS: INTEGER; |
| 15 | |
| 16 | (********** P L O T T E R PROZEDUREN **********) |
| 17 | |
| 18 | PROCEDURE PEN(I:CHAR); |
| 19 | BEGIN WRITE(I) END; |
| 20 | |
| 21 | PROCEDURE SEND(IX,IY: INTEGER); |
| 22 | BEGIN |
| 23 | IF IX>=0 THEN WRITE( IX:1,"@") |
| 24 | ELSE WRITE(-IX:1,"P"); |
| 25 | IF IY>=0 THEN WRITE( IY:1,"A") |
| 26 | ELSE WRITE(-IY:1,"Q") |
| 27 | END; |
| 28 | |
| 29 | PROCEDURE MOVE(X,Y: REAL); |
| 30 | BEGIN |
| 31 | PENXPOS:=ROUND(X); PENYPOS:=ROUND(Y); |
| 32 | WRITE("H"); |
| 33 | SEND(PENXPOS,PENYPOS); |
| 34 | WRITELN("K") |
| 35 | END; |
| 36 | |
| 37 | PROCEDURE LINE(X,Y: REAL); |
| 38 | VAR DX,DY: INTEGER; |
| 39 | BEGIN |
| 40 | DX:=ROUND(X)-PENXPOS; |
| 41 | DY:=ROUND(Y)-PENYPOS; |
| 42 | SEND(DX,DY); WRITELN("J"); |
| 43 | PENXPOS:=PENXPOS+DX; PENYPOS:=PENYPOS+DY |
| 44 | END; |
| 45 | |
| 46 | PROCEDURE DOTS(X,Y: REAL); |
| 47 | CONST DIST=30.0; |
| 48 | VAR U,V,DX,DY,L,SX,SY: REAL; |
| 49 | BEGIN |
| 50 | U:=PENXPOS; V:=PENYPOS; |
| 51 | DX:=X-U; DY:=Y-V; |
| 52 | L:=SQRT(DX*DX + DY*DY); |
| 53 | IF L>0 THEN |
| 54 | BEGIN SX:=DX/L*DIST; SY:=DY/L*DIST; |
| 55 | WHILE L>DIST DO |
| 56 | BEGIN U:=U+SX; V:=V+SY; |
| 57 | L:=L-DIST; |
| 58 | MOVE(U,V); PEN(DOWN) |
| 59 | END; |
| 60 | MOVE(X,Y); PEN(DOWN) |
| 61 | END |
| 62 | END; |
| 63 | |
| 64 | PROCEDURE BLATTWECHSEL; |
| 65 | BEGIN PEN(UP); WRITELN(" ":384) END; |
| 66 | |
| 67 | (***********************************************) |
| 68 | |
| 69 | |
| 70 | PROCEDURE ROTATIONSMATRIX; |
| 71 | CONST RAD=1.745329252E-2; |
| 72 | VAR SINA,COSA,SINB,COSB,SINC,COSC: REAL; |
| 73 | |
| 74 | BEGIN |
| 75 | SINA := SIN(ALFA*RAD); COSA := COS(ALFA*RAD); |
| 76 | SINB := SIN(BETA*RAD); COSB := COS(BETA*RAD); |
| 77 | SINC := SIN(GAMMA*RAD); COSC := COS(GAMMA*RAD); |
| 78 | |
| 79 | AXX := COSB*COSC; |
| 80 | AXY := COSB*SINC; |
| 81 | AXZ := -SINB; |
| 82 | |
| 83 | AYX := SINA*SINB*COSC - COSA*SINC; |
| 84 | AYY := SINA*SINB*SINC + COSA*COSC; |
| 85 | AYZ := SINA*COSB; |
| 86 | |
| 87 | AZX := COSA*SINB*COSC + SINA*SINC; |
| 88 | AZY := COSA*SINB*SINC - SINA*COSC; |
| 89 | AZZ := COSA*COSB; |
| 90 | END (* ROTATIONSMATRIX *); |
| 91 | |
| 92 | |
| 93 | PROCEDURE DODEKABESCHREIBUNG; |
| 94 | CONST A=250.0; PI5=0.6283185308; |
| 95 | VAR RI,RA,D,H,Z5,F,G: REAL; |
| 96 | I: INTEGER; |
| 97 | BEGIN Z5 := 2*SQRT(5); |
| 98 | RI := 2*A/SQRT(10-Z5); |
| 99 | RA := A*SQRT(Z5/5+1); |
| 100 | H := A/4*SQRT(10+2.2*Z5); |
| 101 | D := A/4*SQRT(2-0.2*Z5); |
| 102 | |
| 103 | FOR I := 0 TO 4 DO |
| 104 | BEGIN F := 2*PI5*I; G := F + PI5; |
| 105 | DODEKA[I+1].X := RI*COS(F); DODEKA[I+1].Z := -H; |
| 106 | DODEKA[I+1].Y := RI*SIN(F); |
| 107 | DODEKA[I+6].X := RA*COS(F); DODEKA[I+6].Z := -D; |
| 108 | DODEKA[I+6].Y := RA*SIN(F); |
| 109 | DODEKA[I+11].X:= RA*COS(G); DODEKA[I+11].Z:= D; |
| 110 | DODEKA[I+11].Y:= RA*SIN(G); |
| 111 | DODEKA[I+16].X:= RI*COS(G); DODEKA[I+16].Z:= H; |
| 112 | DODEKA[I+16].Y:= RI*SIN(G) |
| 113 | END; |
| 114 | |
| 115 | FLAECHE[ 1,1] := 1; FLAECHE[ 1,2] := 2; FLAECHE[ 1,3] := 3; |
| 116 | FLAECHE[ 1,4] := 4; FLAECHE[ 1,5] := 5; |
| 117 | |
| 118 | FLAECHE[ 2,1] := 11; FLAECHE[ 2,2] := 7; FLAECHE[ 2,3] := 2; |
| 119 | FLAECHE[ 2,4] := 1; FLAECHE[ 2,5] := 6; |
| 120 | |
| 121 | FLAECHE[ 3,1] := 12; FLAECHE[ 3,2] := 8; FLAECHE[ 3,3] := 3; |
| 122 | FLAECHE[ 3,4] := 2; FLAECHE[ 3,5] := 7; |
| 123 | |
| 124 | FLAECHE[ 4,1] := 13; FLAECHE[ 4,2] := 9; FLAECHE[ 4,3] := 4; |
| 125 | FLAECHE[ 4,4] := 3; FLAECHE[ 4,5] := 8; |
| 126 | |
| 127 | FLAECHE[ 5,1] := 14; FLAECHE[ 5,2] := 10; FLAECHE[ 5,3] := 5; |
| 128 | FLAECHE[ 5,4] := 4; FLAECHE[ 5,5] := 9; |
| 129 | |
| 130 | FLAECHE[ 6,1] := 15; FLAECHE[ 6,2] := 6; FLAECHE[ 6,3] := 1; |
| 131 | FLAECHE[ 6,4] := 5; FLAECHE[ 6,5] := 10; |
| 132 | |
| 133 | FLAECHE[ 7,1] := 6; FLAECHE[ 7,2] := 11; FLAECHE[ 7,3] := 16; |
| 134 | FLAECHE[ 7,4] := 20; FLAECHE[ 7,5] := 15; |
| 135 | |
| 136 | FLAECHE[ 8,1] := 7; FLAECHE[ 8,2] := 12; FLAECHE[ 8,3] := 17; |
| 137 | FLAECHE[ 8,4] := 16; FLAECHE[ 8,5] := 11; |
| 138 | |
| 139 | FLAECHE[ 9,1] := 8; FLAECHE[ 9,2] := 13; FLAECHE[ 9,3] := 18; |
| 140 | FLAECHE[ 9,4] := 17; FLAECHE[ 9,5] := 12; |
| 141 | |
| 142 | FLAECHE[10,1] := 9; FLAECHE[10,2] := 14; FLAECHE[10,3] := 19; |
| 143 | FLAECHE[10,4] := 18; FLAECHE[10,5] := 13; |
| 144 | |
| 145 | FLAECHE[11,1] := 10; FLAECHE[11,2] := 15; FLAECHE[11,3] := 20; |
| 146 | FLAECHE[11,4] := 19; FLAECHE[11,5] := 14; |
| 147 | |
| 148 | FLAECHE[12,1] := 16; FLAECHE[12,2] := 17; FLAECHE[12,3] := 18; |
| 149 | FLAECHE[12,4] := 19; FLAECHE[12,5] := 20; |
| 150 | |
| 151 | |
| 152 | WEG[1] := 1; WEG[2] := 2; WEG[3] := 3; WEG[4] := 4; |
| 153 | WEG[5] := 5; WEG[6] := 1; WEG[7] := 6; WEG[8] := 11; |
| 154 | WEG[9] := 7; WEG[10]:= 12; WEG[11]:= 8; WEG[12]:= 13; |
| 155 | WEG[13]:= 9; WEG[14]:= 14; WEG[15]:= 10; WEG[16]:= 15; |
| 156 | WEG[17]:= 20; WEG[18]:= 19; WEG[19]:= 18; WEG[20]:= 17; |
| 157 | WEG[21]:= 16; WEG[22]:= 20; WEG[23]:= 15; WEG[24]:= 6; |
| 158 | WEG[25]:= 16; WEG[26]:= 11; WEG[27]:= 7; WEG[28]:= 2; |
| 159 | WEG[29]:= 3; WEG[30]:= 8; WEG[31]:= 12; WEG[32]:= 17; |
| 160 | WEG[33]:= 18; WEG[34]:= 13; WEG[35]:= 9; WEG[36]:= 4; |
| 161 | WEG[37]:= 5; WEG[38]:= 10; WEG[39]:= 14; WEG[40]:= 19 |
| 162 | |
| 163 | (* WEGE ZU 1, 23, 25, ... , 39 SIND KEINE KANTEN! *) |
| 164 | END (* DODEKABESCHREIBUNG *); |
| 165 | |
| 166 | PROCEDURE DREHUNG; |
| 167 | VAR ECKE: INTEGER; |
| 168 | X0,Y0,Z0: REAL; |
| 169 | BEGIN |
| 170 | FOR ECKE := 1 TO 20 DO |
| 171 | BEGIN |
| 172 | X0 := DODEKA[ECKE].X; |
| 173 | Y0 := DODEKA[ECKE].Y; |
| 174 | Z0 := DODEKA[ECKE].Z; |
| 175 | |
| 176 | DODEKA[ECKE].X := AXX*X0 + AXY*Y0 + AXZ*Z0; |
| 177 | DODEKA[ECKE].Y := AYX*X0 + AYY*Y0 + AYZ*Z0; |
| 178 | DODEKA[ECKE].Z := AZX*X0 + AZY*Y0 + AZZ*Z0 |
| 179 | END |
| 180 | END (* DREHUNG *); |
| 181 | |
| 182 | |
| 183 | PROCEDURE ANSICHT; |
| 184 | VAR ECKE,N,I: INTEGER; |
| 185 | BEGIN |
| 186 | FOR ECKE := 1 TO 20 DO DODEKA[ECKE].SICHTBAR := FALSE; |
| 187 | FOR N := 1 TO 12 DO |
| 188 | IF DODEKA[ FLAECHE[N,1] ].Y + |
| 189 | DODEKA[ FLAECHE[N,2] ].Y + |
| 190 | DODEKA[ FLAECHE[N,3] ].Y + |
| 191 | DODEKA[ FLAECHE[N,4] ].Y + |
| 192 | DODEKA[ FLAECHE[N,5] ].Y > 0 |
| 193 | THEN FOR I := 1 TO 5 DO |
| 194 | DODEKA[ FLAECHE[N,I] ].SICHTBAR := TRUE |
| 195 | END (* ANSICHT *); |
| 196 | |
| 197 | |
| 198 | PROCEDURE ZEICHNUNG; |
| 199 | VAR VON, NACH: PUNKT; |
| 200 | I: INTEGER; |
| 201 | BEGIN |
| 202 | FOR I := 1 TO 40 DO |
| 203 | BEGIN |
| 204 | VON := NACH; |
| 205 | NACH := DODEKA[ WEG[I] ]; |
| 206 | IF (I=1) OR (I>22) AND ODD(I) |
| 207 | THEN BEGIN MOVE(OX-NACH.X,OZ+NACH.Z);PEN(DOWN) END |
| 208 | ELSE IF VON.SICHTBAR AND NACH.SICHTBAR |
| 209 | THEN LINE(OX-NACH.X,OZ+NACH.Z) |
| 210 | ELSE DOTS(OX-NACH.X,OZ+NACH.Z) |
| 211 | END |
| 212 | END (* ZEICHNUNG *); |
| 213 | |
| 214 | |
| 215 | |
| 216 | |
| 217 | BEGIN |
| 218 | WHILE NOT EOF DO |
| 219 | BEGIN READ(ALFA,BETA,GAMMA); |
| 220 | ROTATIONSMATRIX; |
| 221 | DODEKABESCHREIBUNG; |
| 222 | FOR BILD := 0 TO 11 DO |
| 223 | BEGIN |
| 224 | OX := 600 + 800*(BILD MOD 4); |
| 225 | OZ := 2200 - 800*(BILD DIV 4); |
| 226 | DREHUNG; |
| 227 | ANSICHT; |
| 228 | ZEICHNUNG |
| 229 | END; |
| 230 | BLATTWECHSEL |
| 231 | END |
| 232 | END. |