@interact
def tecna_rovina(FUN=input_box('x^2-y^2',label="f(x,y)=",type=str),bod=input_grid(1, 2, default=[-1,0],label="[x0,y0]"),x_hr = range_slider(-10, 10, 1, default=(-3,3), label='Osa x'),y_hr = range_slider(-10, 10, 1, default=(-3,3), label='Osa y')):
y=var('y')
f=sage_eval('lambda x,y: ' + FUN)
bod3d = vector(bod[0]+[0])
bod = bod3d[0:2]
x0=bod[0];y0=bod[1]
xmin=x_hr[0];xmax=x_hr[1]
ymin=y_hr[0];ymax=y_hr[1]
Gh=plot3d(f(x,y),(x,xmin,xmax),(y,ymin,ymax),opacity=0.8,color='blue')
H0=point([x0,y0,f(x0,y0)],color='yellow',size=10)
hy(x,y)=diff(f(x,y),y)
hx(x,y)=diff(f(x,y),x)
z=f(x0,y0)+hx(x0,y0)*(x-x0)+hy(x0,y0)*(y-y0)
rovina=plot3d(z,(x,xmin,xmax),(y,ymin,ymax),opacity=0.8,color='grey')
pretty_print("Rovnice tečné roviny:", "z= ",z)
show(Gh+H0+rovina)