#  singbod je procedura, ktera pro danou krivku f 
# najde jeji singularni body. Pokud do parametru
# zadame rozsah pro x a y tak ja krivka navic
# zobrazena v zadanem rozsahu.

singbod:=proc(f,rx,ry)
local eqns;
eqns:={f, diff(f,x),diff(f,y)};
print(solve(eqns));
if (nargs>2) then 
implicitplot(f,x=rx,y=ry,grid=[50,50]);
fi;
end;


# obalka je procedura, ktera spocita
# obalku dane parametricke soustavy F
# krivek s promenymi x, y a parametrem t.
# Do promenne obal pak ulozi krivku odpovidajici
# obalce. Pokud zadame rozsah pro promenne
# x,y, ci dokonce t, tak nam navic obalku zobrazi,
# ci dokonce nekolik krivek z dane parametricke
# soustavy ( defaultne 8 , jinak muzeme pocet
# zadat jako posledni argument)

obalka:=proc(F,rx,ry,rt,h)
local Mn,i,k,FF,Obr,X,r,rmin,rmax,hranice,O_i,test; global obal;
X:=gbasis([F,diff(F,t)],[t,x,y],plex);
obal:=op(nops(X),X);
test:=true;
if  (obal=1) then print(`obalka neexistuje`); test:=false; fi;
if test then print(obal); fi;
Mn:={};
if (nargs>3) and test then
r:=[$ rt];
rmin:=op(1,r);
rmax:=op(nops(r),r);
if (nargs>4) then hranice:=h;
else hranice:=8 fi;
for i from 1 to hranice do
k:=rmin+(1/2)*(1/hranice)+((i-1)/hranice)*(rmax-rmin);
FF:=subs(t=k,F);
O_i:=implicitplot(FF,x=rx,y=ry);
print(i);
Mn:=Mn union {O_i};
od;
fi;
if (nargs>2) and test then 
Obr:=implicitplot(obal,x=rx,y=ry,grid=[50,50],color=red);
Mn:=Mn union {Obr};
display(Mn);
fi;
end;

