program Kresleni;

uses Graph, CRT;

type Lokace = object
                X,Y : integer;
                procedure Init(Xi,Yi : integer);
                function CtiX : integer;
                function CtiY : integer;
              end;

        Bod = object(Lokace)
                Viditelnost : boolean;
                Barva : byte;
                constructor Init(Xi,Yi : integer);
                procedure NastavBarvu(KodBarvy : byte);
                procedure Zobraz; virtual;
                procedure Zhasni; virtual;
                function Stav : boolean;
                procedure Posuv(Xn,Yn : integer);
              end;

       Kruh = object(Bod)
                R : integer;
                constructor Init(Xi,Yi,Ri : integer);
                procedure Zobraz; virtual;
                procedure Zhasni; virtual;
                procedure Zvetsi(E : integer); virtual;
                procedure Zmensi(C : integer); virtual;
              end;
     Oblouk = object(Kruh)
                Zacatek, Konec : integer;
                constructor Init(Xi,Yi,Ri,ZacatekI,KonecI : integer);
                procedure Zobraz; virtual;
                procedure Zhasni; virtual;
              end;

    Ctverec = object(Bod)
                Strana : integer;
                constructor Init(Xi,Yi,Stranai : integer);
                procedure Zobraz; virtual;
                procedure Zhasni; virtual;
              end;
var GDriver : integer;
    GMode   : integer;
    Error   : integer;
    IOblouk : Oblouk;
    ICtverec: Ctverec;
    IKruh   : Kruh;



procedure Lokace.Init(Xi,Yi : integer);
begin
  X := Xi;
  Y := Yi;
end;

function Lokace.CtiX : integer;
begin
  CtiX := X;
end;

function Lokace.CtiY : integer;
begin
  CtiY := Y;
end;

constructor Bod.Init(Xi,Yi : integer);
begin
  Lokace.Init(Xi,Yi);
  Barva:=Graph.GetColor;
  Viditelnost := False;
end;

procedure Bod.NastavBarvu(KodBarvy : byte);
begin
  Barva := KodBarvy;
  Graph.SetColor(KodBarvy);
end;

procedure Bod.Zobraz;
begin
  Viditelnost := True;
  Graph.PutPixel(X,Y,Barva);
end;

procedure Bod.Zhasni;
begin
  Viditelnost := False;
  Graph.PutPixel(X,Y,Graph.GetBkColor);
end;

function Bod.Stav : boolean;
begin
  Stav := Viditelnost;
end;

procedure Bod.Posuv(Xn,Yn : integer);
begin
  Zhasni;
  X := Xn;
  Y := Yn;
  Zobraz;
end;

constructor Kruh.Init(Xi,Yi,Ri : integer);
begin
  Bod.Init(Xi,Yi);
  R := Ri;
end;

procedure Kruh.Zobraz;
begin
  Viditelnost := True;
  NastavBarvu(Barva);
  Graph.Circle(X,Y,R);
end;

procedure Kruh.Zhasni;
begin
  Graph.SetColor(Graph.GetBkColor);
  Viditelnost := False;
  Graph.Circle(X,Y,R);
end;

procedure Kruh.Zvetsi(E : integer);
begin
  Zhasni;
  R := R + E;
  if R < 0 then R := 0;
  Zobraz;
end;

procedure Kruh.Zmensi(C : integer);
begin
  Zvetsi(-C);
end;

constructor Oblouk.Init(Xi,Yi,Ri,ZacatekI,KonecI:integer);
begin
  Kruh.Init(Xi,Yi,Ri);
  Zacatek := ZacatekI;
  Konec := KonecI;
end;

procedure Oblouk.Zobraz;
begin
  Viditelnost := True;
  NastavBarvu(Barva);
  Graph.Arc(X,Y,Zacatek,Konec,R);
end;

procedure Oblouk.Zhasni;
begin
  Graph.SetColor(Graph.GetBkColor);
  Viditelnost := False;
  Graph.Arc(X,Y,Zacatek,Konec,R);
  NastavBarvu(Barva);
end;

constructor Ctverec.Init(Xi,Yi,Stranai:integer);
begin
  Bod.Init(Xi,Yi);
  Strana := Stranai;
end;

procedure Ctverec.Zobraz;
begin
  Viditelnost := True;
  Bod.NastavBarvu(Barva);
  Graph.Rectangle(X,Y,X+Strana,Y+Strana);
end;

procedure Ctverec.Zhasni;
begin
  Graph.SetColor(Graph.GetBkColor);
  Viditelnost := False;
  Graph.Rectangle(X,Y,X+Strana,Y+Strana);
  Bod.NastavBarvu(Barva);
end;


BEGIN
  GDriver := Detect;
  Graph.InitGraph(GDriver,GMode,'');
  if Graph.GraphResult <> GrOk then
  begin
    WriteLn('Graficka chyba.');
    Halt;
  end;
  IKruh.Init(100,180,40);
  IOblouk.Init(200,80,20,20,190);
  ICtverec.Init(300,160,40);
  IKruh.Zobraz;
  IOblouk.Zobraz;
  ICtverec.Zobraz;
  readln;
  Graph.CloseGraph;
END.