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