program wp09zad2;

const
    SZEROKOSC_STRONY = 595;
    WYSOKOSC_STRONY = 842;
    SRODEK_SZEROKOSCI = SZEROKOSC_STRONY / 2;
    SRODEK_WYSOKOSCI = WYSOKOSC_STRONY / 2;
    PROMIEN = SZEROKOSC_STRONY / 2 - 10;
    LICZBA_KATOW = 7;
    JEDNOSTKA_KATA = 2 * PI / LICZBA_KATOW;
    PROMIEN_SCIAGAWKI = 30;
    X_SRODKA_SCIAGAWKI = SZEROKOSC_STRONY - PROMIEN_SCIAGAWKI - 10;
    Y_SRODKA_SCIAGAWKI = PROMIEN_SCIAGAWKI + 10;
    MAKSYMALNA_DLUGOSC_LAMANEJ = 1000;
    EPSILON = 0.00001;

type
    Punkt = record
        x, y : Real
    end;
    Lamana = record
        punkty : array [0 .. MAKSYMALNA_DLUGOSC_LAMANEJ] of Punkt;
        dlugosc : Integer
    end;

function max(a, b : Real) : Real;
begin
    if a < b then
        max := b
    else
        max := a
end;

function min(a, b : Real) : Real;
begin
    if a < b then
        min := a
    else
        min := b
end;

function wieksze(x, y : Real) : Boolean;
begin
    wieksze := x - y > EPSILON
end;

function rowne(x, y : Real) : Boolean;
begin
    rowne := abs(x - y) < EPSILON
end;

function M(p, q, r : Punkt) : Real;
{Definicja przepisana z wazniaka}
begin
    M := p.x * q.y + p.y * r.x + r.y * q.x - (r.x * q.y + q.x * p.y + r.y * p.x)
end;

function przeciecieRzutu(a, b, c, d : Real) : Boolean;
begin
    przeciecieRzutu := wieksze(min(b, d), max(a, c))
end;

function przecinajaSie(p, q, r, s : Punkt) : Boolean;
{Definicja przepisana z wazniaka, z poprawkami}
var Mp, Mq, Mr, Ms : Real;
begin
    Mp := M(r, s, p);
    Mq := M(r, s, q);
    Mr := M(p, q, r);
    Ms := M(p, q, s);
    if wieksze(Mp * Mq, 0) or wieksze(Mr * Ms, 0) then
        przecinajaSie := false
    else if wieksze(0, Mp * Mq) and wieksze(0, Mr * Ms) then
        przecinajaSie := true
    else if not rowne(Mp, 0) or not rowne(Mq, 0)
            or not rowne(Mr, 0) or not rowne(Ms, 0) then
        przecinajaSie := false
    else
        przecinajaSie :=
            przeciecieRzutu(min(p.x, q.x), max(p.x, q.x), min(r.x, s.x), max(r.x, s.x)) or
            przeciecieRzutu(min(p.y, q.y), max(p.y, q.y), min(r.y, s.y), max(r.y, s.y))
end;

function punktDozwolony(var aktualna : Lamana; p : Punkt) : Boolean;
var ok : Boolean;
    i : Integer;
begin
    if wieksze(sqr(p.x - SRODEK_SZEROKOSCI) + sqr(p.y - SRODEK_WYSOKOSCI),
               sqr(PROMIEN)) then
        punktDozwolony := false
    else begin
        ok := true;
        i := 1;
        while (i <= aktualna.dlugosc) and ok do
            if przecinajaSie(
                aktualna.punkty[i - 1], aktualna.punkty[i],
                aktualna.punkty[aktualna.dlugosc], p) then
                ok := false
            else
                i := i + 1;
        punktDozwolony := ok
    end
end;

procedure rysujPlansze;
var i : Integer;
begin
    writeln('%!PS');
    write(SRODEK_SZEROKOSCI, ' ', SRODEK_WYSOKOSCI, ' ', PROMIEN);
    writeln(' 0 360 arc closepath stroke');
    for i := 0 to LICZBA_KATOW - 1 do begin
        write(X_SRODKA_SCIAGAWKI, ' ', Y_SRODKA_SCIAGAWKI, ' moveto ');
        write(X_SRODKA_SCIAGAWKI + PROMIEN_SCIAGAWKI * sin(JEDNOSTKA_KATA * i), ' ');
        write(Y_SRODKA_SCIAGAWKI + PROMIEN_SCIAGAWKI * cos(JEDNOSTKA_KATA * i));
        writeln(' lineto stroke')
    end;
    flush(output)
end;

procedure rysujOdcinek(poczatek, koniec : punkt; p : Integer);
begin
    writeln('%Odcinek w kierunku ', p);
    write(poczatek.x, ' ', poczatek.y, ' moveto ');
    writeln(koniec.x, ' ', koniec.y, ' lineto stroke');
    flush(output)
end;

procedure obliczDocelowy(poczatek : Punkt; p : Integer; var koniec : Punkt);
begin
    koniec.x := poczatek.x + PROMIEN * sin(JEDNOSTKA_KATA * p);
    koniec.y := poczatek.y + PROMIEN * cos(JEDNOSTKA_KATA * p)
end;

procedure uzupelnijStrone(dlugosc : Integer);
begin
    writeln('/Courier findfont 100 scalefont setfont');
    writeln('10 20 moveto (', dlugosc, ') show');
    writeln('showpage');
    flush(output);
    readln
end;

procedure inicjuj(var aktualna : Lamana);
begin
    aktualna.punkty[0].x := SRODEK_SZEROKOSCI;
    aktualna.punkty[0].y := SRODEK_WYSOKOSCI;
    aktualna.dlugosc := 0
end;

procedure dodajPunkt(var aktualna : Lamana; docelowy : Punkt; p : Integer);
begin
    aktualna.dlugosc := aktualna.dlugosc + 1;
    aktualna.punkty[aktualna.dlugosc] := docelowy
end;

procedure rozwiaz;
var p : Integer;
    docelowy : Punkt;
    aktualna : Lamana;
begin
    inicjuj(aktualna);
    rysujPlansze;
    readln(p);
    while p >= 0 do begin
        obliczDocelowy(aktualna.punkty[aktualna.dlugosc], p, docelowy);
        if punktDozwolony(aktualna, docelowy) then begin
            rysujOdcinek(aktualna.punkty[aktualna.dlugosc], docelowy, p);
            dodajPunkt(aktualna, docelowy, p)
        end;
        readln(p)
    end;
    uzupelnijStrone(aktualna.dlugosc)
end;

begin
    rozwiaz
end.
