A large commit.
[pdp8.git] / sw / src / pascal / DODEKA.PS
CommitLineData
81e70d48
PH
1PROGRAM PLOTDODEKAEDER(INPUT,OUTPUT);
2
3CONST UP="H"; DOWN="I";
4
5TYPE PUNKT = RECORD X,Y,Z: REAL; SICHTBAR: BOOLEAN END;
6
7VAR 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
18PROCEDURE PEN(I:CHAR);
19 BEGIN WRITE(I) END;
20
21PROCEDURE 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
29PROCEDURE 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
37PROCEDURE 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
46PROCEDURE 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
64PROCEDURE BLATTWECHSEL;
65 BEGIN PEN(UP); WRITELN(" ":384) END;
66
67(***********************************************)
68
69
70PROCEDURE 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
93PROCEDURE 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
166PROCEDURE 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
183PROCEDURE 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
198PROCEDURE 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
217BEGIN
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
232END.