def pero(expr t)=pickup pencircle scaled t; enddef;

def overdraw(expr p)=erase fill p; draw p; enddef;

def sipka(expr delka,smer)=          %% sipka
 begingroup
 save x,y;
 z1=(0,0); x2=x3=-delka; -y2=y3=2/7delka;
 (z2--z1--z3) rotated smer
 endgroup
enddef;

def fsipka(expr delka,smer,vrchol)=  %% plna sipka
 begingroup
 save x,y;
 z1=origin; x2=x3=x1-delka; y1-y2=y3-y1=2/7delka;
 filldraw ((z3--z2--z1--cycle) rotated smer shifted vrchol);
 endgroup
enddef;

def lsipka(expr delka,smer,konec)=  %% prazdna sipka
 begingroup
 save x,y;
 z1=origin; x2=x3=x1-delka; y1-y2=y3-y1=2/7delka;
 erase fill ((z3--z2--z1--cycle) rotated smer shifted konec);
 draw ((z3--z2--z1--cycle) rotated smer shifted konec);
 endgroup
enddef;

def vektor(expr pocatek,velikost,delka,smer)=  %% vektor
 begingroup;
 save x,y;
 z1=pocatek; z2=(velikost,0) rotated(smer) shifted z1;
 draw z1--z2;
 draw sipka(delka,smer) shifted z2;
 endgroup;
enddef;

def oblouk(expr stred,polomer,uhela,uhelb)= %uhela -> uhelb proti smeru
 begingroup;                                %hodin. rucicek
 save x,y;
 z1=stred+dir(uhela)*polomer;
 z2=stred+dir(uhelb)*polomer;
 z3=stred+dir((uhelb+uhela)/2)*polomer;
 draw z1{dir(uhela+90)}..z3..{dir(uhelb+90)}z2;
 endgroup;
enddef;

def R(expr bod,smer)=                %% znacka pro pravy uhel
 draw quartercircle scaled 6u rotated smer shifted bod;
 drawdot 1.7u*dir45 rotated smer shifted bod withpen currentpen scaled 3;
enddef;

def circ(expr boda,bodb,bodc)=       %% kruznice urcena tremi body
 begingroup
 save x,y,R;
 z1=boda; z2=bodb; z3=bodc; z12=1/2[z1,z2]; z23=1/2[z2,z3];
 z0-z12=whatever*((z1-z2) rotated 90);
 z0-z23=whatever*((z3-z2) rotated 90);
 R=length(z1-z0);
 draw fullcircle scaled 2R  shifted z0;
 endgroup
enddef;

def ecirc(expr boda,bodb,bodc)= %% kruznice urcena tremi body
 begingroup                     %% s vyprazdnenym vnitrkem
 save x,y,R;
 z1=boda; z2=bodb; z3=bodc; z12=1/2[z1,z2]; z23=1/2[z2,z3];
 z0-z12=whatever*((z1-z2) rotated 90);
 z0-z23=whatever*((z3-z2) rotated 90);
 R=length(z1-z0);
 erase fill fullcircle scaled 2R  shifted z0;
 draw fullcircle scaled 2R  shifted z0;
 endgroup
enddef;

def arrow(expr delka,smer)=          %% sipka
 begingroup
 save x,y;
% turningcheck:=0;
 z1=(0,0); x2=x3=-delka; -y2=y3=2/7delka; z4=(-3/4delka,0);
 (z2{dir45}..{right}z1&z1{left}..{dir135}z3&z3..controls z4..z2&z2..cycle) rotated smer
 endgroup
enddef;

def axis(expr bod)=                  %% osy
 begingroup
 save x,y;
 x1=y3=0; x2=w; x3=x4=xpart bod;
 y4=h; y1=y2=ypart bod;
 draw z1--z2; draw z3--z4;
 filldraw arrow(3u,0) shifted z2;
 filldraw arrow(3u,90) shifted z4;
 endgroup
enddef;

def dashline(expr zac,kon,opak)=     %% carkovana cara
 for t=0 upto opak:
  draw (3t/(3opak+2))[zac,kon]--((3t+2)/(3opak+2))[zac,kon];
 endfor
enddef;

def dotline(expr zac,kon,opak)= % teckovana cara
 for t=0 upto opak:
  drawdot (t/opak)[zac,kon];
 endfor
enddef;

def dashdotline(expr zac,kon,opak)= % cerchovana cara
 for t=0 upto opak:
  draw (5t/(5opak+3))[zac,kon]--((5t+3)/(5opak+3))[zac,kon];
 endfor
 for t=0 upto (opak-1):
  drawdot ((5t+4)/(5opak+3))[zac,kon];
 endfor
enddef;

def odot(expr bod, polomer)= % krouzek
 erase fill fullcircle scaled polomer shifted bod;
 draw fullcircle scaled polomer shifted bod;
enddef;

def dashcircle(expr stred,polomer,pocat_uhel,opak)= % carkovana kruznice
 % v uhlu 0 je v carkovane kruznici mezera pro pocat_uhel=36/opak
 % (carkovana kruznice je soumerna podle vodorovne sve osy )
 for t=0 upto (opak-1):
  oblouk(stred,polomer,t*360/opak+pocat_uhel,(t+0.6)*360/opak+pocat_uhel);
 endfor
enddef;

def dashdotcircle(expr stred,polomer,pocat_uhel,opak)= % cerchovana kruznice
 % v uhlu 0 je v cerchovane kruznici tecka pro pocat_uhel=72/opak
 % (cerchovana kruznice je soumerna podle vodorovne sve osy )
 for t=0 upto (opak-1):
  oblouk(stred,polomer,t*360/opak+pocat_uhel,(t+0.6)*360/opak+pocat_uhel);
  oblouk(stred,polomer,(t+0.8)*360/opak+pocat_uhel,(t+0.8)*360/opak+pocat_uhel);
 endfor;
enddef;

def dotcircle(expr stred,polomer,pocat_uhel,opak)= % teckovana kruznice
 % v uhlu 0 je v teckovane kruznici mezera pro pocat_uhel=180/opak
 % (teckovana kruznice je soumerna podle vodorovne sve osy )
 for t=0 upto (opak-1):
  oblouk(stred,polomer,t*360/opak+pocat_uhel,t*360/opak+pocat_uhel);
 endfor
enddef;

def carkoblouk(expr stred,polomer,uhela,uhelb,opak)= % carkovany oblouk
 for t=0 upto opak:
  oblouk(stred,polomer,t*(uhelb-uhela)/(opak+.6)+uhela,
  (t+0.6)*(uhelb-uhela)/(opak+.6)+uhela);
 endfor
enddef;

def cerchoblouk(expr stred,polomer,uhela,uhelb,opak)= % cerchovany oblouk
 for t=0 upto opak:
  oblouk(stred,polomer,5*t*(uhelb-uhela)/(5*opak+3)+uhela,
  (5*t+3)*(uhelb-uhela)/(5*opak+3)+uhela);
 endfor;
 for t=0 upto (opak-1):
  oblouk(stred,polomer,(5*t+4)*(uhelb-uhela)/(5*opak+3)+uhela,
  (5*t+4)*(uhelb-uhela)/(5*opak+3)+uhela);
 endfor
enddef;

def teckoblouk(expr stred,polomer,uhela,uhelb,opak)= % teckovany oblouk
 for t=0 upto opak:
  oblouk(stred,polomer,t*(uhelb-uhela)/opak+uhela,t*(uhelb-uhela)/opak+uhela);
 endfor
enddef;

def osy(expr bod,delka)= % osy pres cely obrazek
begingroup
 save x,y;
 x1=y3=0; x2=w; x3=x4=xpart bod;
 y4=h; y1=y2=ypart bod;
 draw (0,ypart bod)--(w,ypart bod); draw (xpart bod,0)--(xpart bod,h);
 draw sipka(delka,90) shifted (xpart bod,h);
 draw sipka(delka,0) shifted (w,ypart bod);
endgroup;
enddef;

def pulosy(expr bod,delka,pokr,hokr)=  %osy - 1. kvadrant
begingroup
 save x,y;
 draw bod--(w-pokr,ypart bod); draw bod--(xpart bod,h-hokr);
 draw sipka(delka,90) shifted (xpart bod,h-hokr);
 draw sipka(delka,0)  shifted (w-pokr,ypart bod);
endgroup;
enddef;

def meritka(expr bod,velcarky,hdilek,vdilek)=
 for i=1 upto ((w-1-xpart bod)/hdilek):
   draw ((0,velcarky/2)--(0,-velcarky/2)) shifted (bod+i*(hdilek,0)); endfor;
 for i=1 upto ((xpart bod-1)/hdilek):
   draw ((0,velcarky/2)--(0,-velcarky/2)) shifted (bod-i*(hdilek,0)); endfor;
 for i=1 upto ((h-1-ypart bod)/vdilek):
   draw ((velcarky/2,0)--(-velcarky/2,0)) shifted (bod+i*(0,vdilek)); endfor;
 for i=1 upto ((ypart bod-1)/vdilek):
   draw ((velcarky/2,0)--(-velcarky/2,0)) shifted (bod-i*(0,vdilek)); endfor;
enddef;

def sit=
 for i=0 step 5 until w/u+.1:
   draw (i*u,0)--(i*u,h) withpen currentpen scaled .3; endfor;
 for i=0 s upto h/5u+.1:
   draw (0,i*5u)--(w,i*5u) withpen currentpen scaled .3; endfor;
enddef;

%%% Pridano pro potreby FKS

%%%%% Smer udava, kam se bude vykreslovat srafovani,
%%%%% +1...po leve strane pri behu ve smeru kladneho casu, -1...naopak
def pevna_cara(expr p,smer,tloustka,roztec,cesta)=
 numeric pocet;
 pocet=round((w+h)/roztec);
 picture V;
 V=currentpicture;
 for i:=1 upto pocet:
  draw (origin--(h,h)) shifted ((-h,0)+(i*roztec,0)) withpen
  currentpen scaled .5;
 endfor;
 begingroup
  save x,y;
  for i:=0 upto length(p):
   z[i]=point i of p;
   z[i]'=z[i]+tloustka*dir(angle(direction i of p)+smer*90);
  endfor;
  fill z0 for i:=1 upto length(p):{direction (i-1) of p}..{direction i of p}z[i] endfor--
   reverse (z0' for i:=1 upto length(p):{direction (i-1) of p}..{direction i of p}z[i]' endfor)--cycle;
 endgroup;
 cull currentpicture keeping(2,2);
 addto currentpicture also V;
 if cesta: draw p; fi;
enddef;

%%%%% Smer udava, kam se bude vykreslovat srafovani,
%%%%% +1...po leve strane pri behu ve smeru kladneho casu, -1...naopak
def pevna_cara_vodorovne_konce(expr p,smer,tloustka,roztec,sklon,cesta)=
 numeric pocet;
 pocet=round((w+h)/roztec);
 picture V;
 V=currentpicture;
 for i:=-5 upto pocet:
  draw (origin--(h*(cosd sklon)/(sind sklon),h))
  shifted ((-h,0)+(i*roztec,0)) withpen currentpen scaled .5;
 endfor;
 begingroup
  save x,y;
  for i:=1 upto (length(p)-1):
   z[i]=point i of p;
   z[i]'=z[i]+tloustka*dir(angle(direction i of p)+smer*90);
  endfor;
  z0=point 0 of p;
  z[length(p)]=point length(p) of p;
  z0'=z0-smer*tloustka*right/%dir(angle(direction i of p)+smer*90)/
      abs(cosd(angle(direction 0 of p)+smer*90));
  z[length(p)]'=z[length(p)]-smer*tloustka*right/%dir(angle(direction i of p)+smer*90)/
      abs(cosd(angle(direction length(p) of p)+smer*90));
  fill z0 for i:=1 upto length(p):{direction (i-1) of p}..{direction i of p}z[i] endfor--
   reverse (z0' for i:=1 upto length(p):{direction (i-1) of p}..{direction i of p}z[i]' endfor)--cycle;
 endgroup;
 cull currentpicture keeping(2,2);
 addto currentpicture also V;
 if cesta: draw p; fi;
enddef;

def krizek(expr bod,sirka)=
 draw bod-(.5sirka,.5sirka)--bod+(.5sirka,.5sirka);
 draw bod+(-.5sirka,.5sirka)--bod+(.5sirka,-.5sirka);
enddef;

def rotovani(expr bod,sirka)=
 path rot;
 rot=(sirka*dir(112.5)) for i:=1 upto 11:
  {dir(202.5+(i-1)*22.5)}..{dir(202.5+i*22.5)}(sirka*dir(112.5+i*22.5))
  endfor..{dir(147.5)}(sirka*dir(67.5));
 draw rot yscaled .5 shifted bod;
 draw sipka(sirka/2,angle(direction 12 of (rot yscaled .5))-8)
  shifted (bod+point 12 of (rot yscaled .5));
enddef;

def ramecek=
draw unitsquare xscaled w yscaled h;
enddef;
