A large commit.
[pdp8.git] / sw / src / pascal / WUERFL.PS
1 PROGRAM PLOTWUERFEL(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 WUERFEL: ARRAY["A".."H"] OF PUNKT;
11 FLAECHE: ARRAY[1..6,1..4] OF CHAR;
12 WEG: ARRAY[1..16] OF CHAR;
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 WUERFELBESCHREIBUNG;
94 CONST H=250.0;
95 VAR I: INTEGER;
96
97 BEGIN
98 FLAECHE[1,1] := "A"; FLAECHE[1,2] := "B";
99 FLAECHE[1,3] := "F"; FLAECHE[1,4] := "E";
100
101 FLAECHE[2,1] := "C"; FLAECHE[2,2] := "D";
102 FLAECHE[2,3] := "H"; FLAECHE[2,4] := "G";
103
104 FLAECHE[3,1] := "B"; FLAECHE[3,2] := "C";
105 FLAECHE[3,3] := "G"; FLAECHE[3,4] := "F";
106
107 FLAECHE[4,1] := "D"; FLAECHE[4,2] := "A";
108 FLAECHE[4,3] := "E"; FLAECHE[4,4] := "H";
109
110 FLAECHE[5,1] := "E"; FLAECHE[5,2] := "F";
111 FLAECHE[5,3] := "G"; FLAECHE[5,4] := "H";
112
113 FLAECHE[6,1] := "A"; FLAECHE[6,2] := "B";
114 FLAECHE[6,3] := "C"; FLAECHE[6,4] := "D";
115
116
117 FOR I := 1 TO 4 DO
118 BEGIN
119 WUERFEL[ FLAECHE[1,I] ].X := H;
120 WUERFEL[ FLAECHE[2,I] ].X := -H;
121 WUERFEL[ FLAECHE[3,I] ].Y := H;
122 WUERFEL[ FLAECHE[4,I] ].Y := -H;
123 WUERFEL[ FLAECHE[5,I] ].Z := H;
124 WUERFEL[ FLAECHE[6,I] ].Z := -H
125 END;
126
127
128 WEG[1] := "A"; WEG[2] := "B"; WEG[3] := "C"; WEG[4] := "D";
129 WEG[5] := "A"; WEG[6] := "E"; WEG[7] := "F"; WEG[8] := "G";
130 WEG[9] := "H"; WEG[10]:= "E"; WEG[11]:= "F"; WEG[12]:= "B";
131 WEG[13]:= "C"; WEG[14]:= "G"; WEG[15]:= "H"; WEG[16]:= "D"
132
133 (* WEGE ZU 1, 11, 13 U. 15 SIND KEINE KANTEN! *)
134 END (* WUERFELBESCHREIBUNG *);
135
136
137 PROCEDURE DREHUNG;
138 VAR ECKE: CHAR;
139 X0,Y0,Z0: REAL;
140 BEGIN
141 FOR ECKE := "A" TO "H" DO
142 BEGIN
143 X0 := WUERFEL[ECKE].X;
144 Y0 := WUERFEL[ECKE].Y;
145 Z0 := WUERFEL[ECKE].Z;
146
147 WUERFEL[ECKE].X := AXX*X0 + AXY*Y0 + AXZ*Z0;
148 WUERFEL[ECKE].Y := AYX*X0 + AYY*Y0 + AYZ*Z0;
149 WUERFEL[ECKE].Z := AZX*X0 + AZY*Y0 + AZZ*Z0
150 END
151 END (* DREHUNG *);
152
153
154 PROCEDURE ANSICHT;
155 VAR ECKE: CHAR;
156 N,I: INTEGER;
157 BEGIN
158 FOR ECKE := "A" TO "H" DO WUERFEL[ECKE].SICHTBAR := FALSE;
159 FOR N := 1 TO 6 DO
160 IF WUERFEL[ FLAECHE[N,1] ].Y + WUERFEL[ FLAECHE[N,3] ].Y > 0
161 THEN FOR I := 1 TO 4 DO
162 WUERFEL[ FLAECHE[N,I] ].SICHTBAR := TRUE
163 END (* ANSICHT *);
164
165
166 PROCEDURE ZEICHNUNG;
167 VAR VON, NACH: PUNKT;
168 I: INTEGER;
169 BEGIN
170 FOR I := 1 TO 16 DO
171 BEGIN
172 VON := NACH;
173 NACH := WUERFEL[ WEG[I] ];
174 IF (I=1) OR (I>10) AND ODD(I)
175 THEN BEGIN MOVE(OX-NACH.X,OZ+NACH.Z);PEN(DOWN) END
176 ELSE IF VON.SICHTBAR AND NACH.SICHTBAR
177 THEN LINE(OX-NACH.X,OZ+NACH.Z)
178 ELSE DOTS(OX-NACH.X,OZ+NACH.Z)
179 END
180 END (* ZEICHNUNG *);
181
182
183
184
185 BEGIN
186 WHILE NOT EOF DO
187 BEGIN READ(ALFA,BETA,GAMMA);
188 ROTATIONSMATRIX;
189 WUERFELBESCHREIBUNG;
190 FOR BILD := 0 TO 11 DO
191 BEGIN
192 OX := 600 + 800*(BILD MOD 4);
193 OZ := 2200 - 800*(BILD DIV 4);
194 DREHUNG;
195 ANSICHT;
196 ZEICHNUNG
197 END;
198 BLATTWECHSEL
199 END
200 END.