File: ALTREE.PS of Tape: Various/Decus/decus-3
(Source file text) 

PROGRAM PLOTALLTREES(INPUT,OUTPUT);

  VAR   N,TREE: INTEGER;
        OX,OY: REAL;
        X,Y: ARRAY[1..6] OF REAL;
        U,V: ARRAY[1..6] OF INTEGER;

      PENXPOS,PENYPOS: INTEGER;

(********** P L O T T E R  PROZEDUREN **********)

PROCEDURE PEN(I:CHAR);
    BEGIN WRITE(I) END;

PROCEDURE SEND(IX,IY: INTEGER);
    BEGIN
      IF IX>=0  THEN WRITE( IX:1,"@")
                ELSE WRITE(-IX:1,"P");
      IF IY>=0  THEN WRITE( IY:1,"A")
                ELSE WRITE(-IY:1,"Q")
    END;

PROCEDURE MOVE(X,Y: REAL);
    BEGIN
      PENXPOS:=ROUND(X); PENYPOS:=ROUND(Y);
      WRITE("H");
      SEND(PENXPOS,PENYPOS);
      WRITELN("K")
    END;

PROCEDURE LINE(X,Y: REAL);
  VAR DX,DY: INTEGER;
    BEGIN
      DX:=ROUND(X)-PENXPOS;
      DY:=ROUND(Y)-PENYPOS;
      SEND(DX,DY); WRITELN("J");
      PENXPOS:=PENXPOS+DX; PENYPOS:=PENYPOS+DY
    END;

PROCEDURE SYSIZE(R,G: INTEGER);
    BEGIN
      WRITE("C", CHR(G+16*(R+2)))
    END;

PROCEDURE BLATTWECHSEL;
  BEGIN PEN("H"); WRITELN(" ":384); TREE := 0 END;
(***********************************************)

PROCEDURE INITPOINTS;
  CONST R=150.0; RAD=0.0174533;
  VAR   I: INTEGER;
        P1W: ARRAY[3..6] OF REAL;
BEGIN
    P1W[3] := -30.0; P1W[4] := 45.0; P1W[5] := 18.0; P1W[6] := 60.0;
    FOR I := 1 TO N DO
        BEGIN
            X[I] := R*COS( (I*360/N + P1W[N]) * RAD);
            Y[I] := R*SIN( (I*360/N + P1W[N]) * RAD)
        END
END (* INITPOINTS *);


PROCEDURE DECODE;
  VAR   I,K: INTEGER;
        Z: ARRAY[1..6] OF INTEGER;
BEGIN
    FOR I := 1 TO N DO Z[I] := 0;
    FOR K := 1 TO N-1 DO Z[ V[K] ] := Z[ V[K] ] + 1;
    FOR K := 1 TO N-1 DO
        BEGIN I := 1; WHILE Z[I]<>0 DO I := I + 1;
            U[K] := I;
            Z[I] := -1  (* FORGET THIS VERTEX *);
            Z[ V[K] ] := Z[ V[K] ] - 1
        END
END (* DECODE *);


PROCEDURE PLOTTREE;
  VAR   K: INTEGER;
BEGIN
    DECODE;
    OX :=  200 + 400*(TREE MOD 9);
    OY := 2600 - 400*(TREE DIV 9);
    FOR K := 1 TO N-1 DO
        BEGIN
            MOVE(OX+X[ U[K] ], OY+Y[ U[K] ]); PEN("I");
            LINE(OX+X[ V[K] ], OY+Y[ V[K] ])
        END;
    TREE := TREE + 1; IF TREE=63 THEN BLATTWECHSEL
END (* PLOTTREE *);

PROCEDURE COMBITREE(N,K: INTEGER);
  VAR Z: INTEGER;
BEGIN
    IF K>0 THEN
        BEGIN   FOR Z := 1 TO N DO
                BEGIN V[K] := Z; COMBITREE(N,K-1) END
        END ELSE PLOTTREE
END (* COMBITREE *);



BEGIN
        READ(N);
        INITPOINTS;
        TREE := 0;
        V[N-1] := N;  COMBITREE(N,N-2);
        BLATTWECHSEL
END.