Commit | Line | Data |
---|---|---|
81e70d48 PH |
1 | PROGRAM PLOTALLTREES(INPUT,OUTPUT); |
2 | ||
3 | VAR N,TREE: INTEGER; | |
4 | OX,OY: REAL; | |
5 | X,Y: ARRAY[1..6] OF REAL; | |
6 | U,V: ARRAY[1..6] OF INTEGER; | |
7 | ||
8 | PENXPOS,PENYPOS: INTEGER; | |
9 | ||
10 | (********** P L O T T E R PROZEDUREN **********) | |
11 | ||
12 | PROCEDURE PEN(I:CHAR); | |
13 | BEGIN WRITE(I) END; | |
14 | ||
15 | PROCEDURE SEND(IX,IY: INTEGER); | |
16 | BEGIN | |
17 | IF IX>=0 THEN WRITE( IX:1,"@") | |
18 | ELSE WRITE(-IX:1,"P"); | |
19 | IF IY>=0 THEN WRITE( IY:1,"A") | |
20 | ELSE WRITE(-IY:1,"Q") | |
21 | END; | |
22 | ||
23 | PROCEDURE MOVE(X,Y: REAL); | |
24 | BEGIN | |
25 | PENXPOS:=ROUND(X); PENYPOS:=ROUND(Y); | |
26 | WRITE("H"); | |
27 | SEND(PENXPOS,PENYPOS); | |
28 | WRITELN("K") | |
29 | END; | |
30 | ||
31 | PROCEDURE LINE(X,Y: REAL); | |
32 | VAR DX,DY: INTEGER; | |
33 | BEGIN | |
34 | DX:=ROUND(X)-PENXPOS; | |
35 | DY:=ROUND(Y)-PENYPOS; | |
36 | SEND(DX,DY); WRITELN("J"); | |
37 | PENXPOS:=PENXPOS+DX; PENYPOS:=PENYPOS+DY | |
38 | END; | |
39 | ||
40 | PROCEDURE SYSIZE(R,G: INTEGER); | |
41 | BEGIN | |
42 | WRITE("C", CHR(G+16*(R+2))) | |
43 | END; | |
44 | ||
45 | PROCEDURE BLATTWECHSEL; | |
46 | BEGIN PEN("H"); WRITELN(" ":384); TREE := 0 END; | |
47 | (***********************************************) | |
48 | ||
49 | PROCEDURE INITPOINTS; | |
50 | CONST R=150.0; RAD=0.0174533; | |
51 | VAR I: INTEGER; | |
52 | P1W: ARRAY[3..6] OF REAL; | |
53 | BEGIN | |
54 | P1W[3] := -30.0; P1W[4] := 45.0; P1W[5] := 18.0; P1W[6] := 60.0; | |
55 | FOR I := 1 TO N DO | |
56 | BEGIN | |
57 | X[I] := R*COS( (I*360/N + P1W[N]) * RAD); | |
58 | Y[I] := R*SIN( (I*360/N + P1W[N]) * RAD) | |
59 | END | |
60 | END (* INITPOINTS *); | |
61 | ||
62 | ||
63 | PROCEDURE DECODE; | |
64 | VAR I,K: INTEGER; | |
65 | Z: ARRAY[1..6] OF INTEGER; | |
66 | BEGIN | |
67 | FOR I := 1 TO N DO Z[I] := 0; | |
68 | FOR K := 1 TO N-1 DO Z[ V[K] ] := Z[ V[K] ] + 1; | |
69 | FOR K := 1 TO N-1 DO | |
70 | BEGIN I := 1; WHILE Z[I]<>0 DO I := I + 1; | |
71 | U[K] := I; | |
72 | Z[I] := -1 (* FORGET THIS VERTEX *); | |
73 | Z[ V[K] ] := Z[ V[K] ] - 1 | |
74 | END | |
75 | END (* DECODE *); | |
76 | ||
77 | ||
78 | PROCEDURE PLOTTREE; | |
79 | VAR K: INTEGER; | |
80 | BEGIN | |
81 | DECODE; | |
82 | OX := 200 + 400*(TREE MOD 9); | |
83 | OY := 2600 - 400*(TREE DIV 9); | |
84 | FOR K := 1 TO N-1 DO | |
85 | BEGIN | |
86 | MOVE(OX+X[ U[K] ], OY+Y[ U[K] ]); PEN("I"); | |
87 | LINE(OX+X[ V[K] ], OY+Y[ V[K] ]) | |
88 | END; | |
89 | TREE := TREE + 1; IF TREE=63 THEN BLATTWECHSEL | |
90 | END (* PLOTTREE *); | |
91 | ||
92 | PROCEDURE COMBITREE(N,K: INTEGER); | |
93 | VAR Z: INTEGER; | |
94 | BEGIN | |
95 | IF K>0 THEN | |
96 | BEGIN FOR Z := 1 TO N DO | |
97 | BEGIN V[K] := Z; COMBITREE(N,K-1) END | |
98 | END ELSE PLOTTREE | |
99 | END (* COMBITREE *); | |
100 | ||
101 | ||
102 | ||
103 | BEGIN | |
104 | READ(N); | |
105 | INITPOINTS; | |
106 | TREE := 0; | |
107 | V[N-1] := N; COMBITREE(N,N-2); | |
108 | BLATTWECHSEL | |
109 | END. |