Commit | Line | Data |
---|---|---|
81e70d48 PH |
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. |