(*----------------------------------------------------------*
 * Definitia tipurilor de date folosite in restul bibliotecii
 * de fata.
 *----------------------------------------------------------*)

unit Types;
interface
{$N+} {Directiva pentru a putea folosi tipul Extended}
const
   MAX_ELEM = 1000; {Nr maxim de puncte, segmente... dintr-o lista}

type
   TCoord  = double;        { Poate fi single | double | extended }
   TNrElem = 0..MAX_ELEM;   { Tip pentru numararea elementelor. Numararea incepe cu 0 }
   TElem   = array[TNrElem] of TNrElem; { Lista de indici }
(*----------------------------------------------------------*)
(* Puncte *)
   TPunct      = packed record x, y: TCoord end; {Tipul Punct}
   TabelPuncte = array[TNrElem] of TPunct;
   PPunct      = ^TPunct;
   PTabelPuncte = ^TabelPuncte;

   {Celula pentru lista bidirectionala}
   PCell = ^Cell;
   Cell  = record
      p: PPunct;
      prec, urm: PCell;
   end;
   
   ListPuncte = ^CellList;
   CellList = record
     p: TPunct;
     urm: ListPuncte;
   end;
(*----------------------------------------------------------*)
(* Drepte *)
   Dreapta     = record A, B, C: TCoord end; { Ecuatia dreptei: Ax + By + C = 0 }
   TabelDrepte = array[TNrElem] of Dreapta;
   PDreapta    = ^Dreapta;

(*----------------------------------------------------------*)
(* Segmente *)
   Segment = record p1, p2: TPunct end ;
   TabelSegmente = array[TNrElem] of Segment;
   PSegment = ^Segment ;

   SegmentP = record p1, p2: PPunct end ;
   TabelSegmenteP = array[TNrElem] of SegmentP;

(*----------------------------------------------------------*)
   RelDrepte = (vid, inters, incident, nedet); {Tip enumerare folosit ca raspuns al functiei}
(*----------------------------------------------------------*)
const ZeroP: TPunct = (x: 0; y:0);
(*----------------------------------------------------------*)
implementation

end.
