The function f:(ℝ^2)⟶ℝ, z=f(x,y)=(x^2)+(y^2) is called the parabolic bowl.  g:(ℝ^2)⟶ℝ, z=g(x,y)=cos x sin y  is what I will call here the egg carton, and h:(ℝ^2)⟶ℝ, z=h(x,y)=2(x^2)-(y^2) is the saddle.

scalemax = 10;
limit = Sqrt[scalemax];
scale = {-scalemax-1.,scalemax+.1};
f[x_,y_]:=x^2+y^2;
g[x_,y_]:=2*Cos[x]*Sin[y];
h[x_,y_]:=2*x^2-y^2;
bowl = Plot3D[f[x,y],{x,-limit,limit},{y,-limit,limit},RegionFunction->Function[{x,y,z},x^2+y^2≤scalemax],PlotRange->{scale,scale,{-1,scalemax}},Axes->True,AxesOrigin->{0,0,0},Mesh->False,Boxed->False,AspectRatio->1,ImageSize->400];
eggcarton= Plot3D[g[x,y],{x,-limit,limit},{y,-limit,limit},Axes->True,AxesOrigin->{0,0,0},Boxed->False,Mesh->False,AspectRatio->1,ImageSize->350];
saddle = Plot3D[h[x,y],{x,-10,10},{y,-10,10},Axes->True,AxesOrigin->{0,0,0},Boxed->False,Mesh->False,AspectRatio->1,ImageSize->350];
{Show[bowl],Show[eggcarton],Show[saddle]}

Vertical slices, at a point and in a certain direction allow us to calculate directional derivatives using Calculus I theory and techniques by restricting the graph of the function to the vertical plane containing the direction vector.  For a vector (OverVector[v])=[({{(Subscript[v, 1])}, {(Subscript[v, 2])}})], assuming unit length, this vector corresponds to the line in the x y-plane given by y=((Subscript[v, 2])/(Subscript[v, 1]))x, (with suitable adaptation when (Subscript[v, 1])=0).  Hence the plane is just (Subscript[v, 2])x+(Subscript[v, 1])y=0.  Here, we grab what we can see as a critical point for each and start looking at vertical slices and watching the concavity of the slices as we vary the direction.

vfslice[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,z},{x,-scalemax,scalemax},{z,-scalemax,scalemax},Mesh->None,PlotStyle->Opacity[.8]]
vfcut[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,f[x,(v2/v1)x]},{x,-scalemax,scalemax},PlotStyle->{Red,Thick}]
incutplot[v1_,v2_]:=Plot[f[v1*x,v2*x],{x,-scalemax,scalemax},PlotStyle->{Thick,Red},PlotRange->{{-scalemax/2,scalemax/2},{-1,scalemax}},PlotLabel->Style["slice-plane at fixed v",FontSize->18],AxesLabel->{y,z},ImageSize->250]
fHess[v1_,v2_]:={v1,v2}.D[D[f[x,y],{{x,y}}],{{x,y}}].{v1,v2}
Print["The Hessian Matrix is: ",MatrixForm[D[D[f[x,y],{{x,y}}],{{x,y}}]/. {x->0,y->0}]]
Print["The Quadratic Form corresponding to this Hessian is: ",fHess[v1,v2]]

Manipulate[Show[bowl,vfslice[v1,v2],vfcut[v1,v2]],{v1,-10,10},{v2,-10,10}]

vgslice[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,z},{x,-scalemax,scalemax},{z,-scalemax,scalemax},Mesh->None,PlotStyle->Opacity[.8]]
vgslice0Pi2[v1_,v2_]:=ParametricPlot3D[{x,(v2/v1)x+Pi/2,z},{x,-scalemax,scalemax},{z,-scalemax,scalemax},Mesh->None,PlotStyle->Opacity[.8]]
vgcut[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,g[x,(v2/v1)x]},{x,-scalemax,scalemax},PlotStyle->{Red,Thick}]
vgcut0Pi2[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x+Pi/2,g[x,(v2/v1)x+Pi/2]},{x,-scalemax,scalemax},PlotStyle->{Red,Thick}]

gHess[v1_,v2_]:={v1,v2}.D[D[g[x,y],{{x,y}}],{{x,y}}].{v1,v2}/.{x->0,y->Pi/2}
Print["The Hessian Matrix is: ",MatrixForm[D[D[g[x,y],{{x,y}}],{{x,y}}]/. {x->0,y->Pi/2}]]
Print["The Quadratic Form corresponding to this Hessian is: ",gHess[v1,v2]]
Manipulate[{Show[eggcarton,vgslice[x,y],vgcut[x,y]],Show[eggcarton,vgslice0Pi2[x,y],vgcut0Pi2[x,y]],gHess[x,y]},{x,-10,10},{y,-10,10}]

vhslice[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,z},{x,-scalemax,scalemax},{z,-200,200},Mesh->None,PlotStyle->Opacity[.8]]
vhcut[v1_,v2_]:= ParametricPlot3D[{x,(v2/v1)x,h[x,(v2/v1)x]},{x,-scalemax,scalemax},PlotStyle->{Red,Thick}]
Manipulate[Show[saddle,vhslice[x,y],vhcut[x,y]],{x,-10,10},{y,-10,10}]

Here, we use the Mathematica function CountourPlot to view the level sets of z=f(x,y)=(x^2)+(y^2).

ContourPlot[x^2+y^2,{x,-scalemax,scalemax},{y,-scalemax,scalemax}]

Consider now the new function of 3 variables w=f(x,y,z)=(x^2)+(y^2)+(z^2).  We cannot actually “see” the graph of this function as it lives in 4-dimensional space.  However, we can “cut” through it with horizontal sections and slices by thinking of the floor of (ℝ^4) as the 3-dimensional  x y z -space and w as the height over it.  So what do the contours (the projections of the sections back into x y z -space) look like?

wcutupper[c_]:= ParametricPlot3D[{t,u,Sqrt[c-t^2-u^2]},{t,-Sqrt[c],Sqrt[c]},{u,-Sqrt[c],Sqrt[c]},Mesh->None,Axes->True, AxesOrigin->{0,0,0},Boxed->False,PlotRange->{-scalemax/3,scalemax/3}]
wcutlower[c_]:= ParametricPlot3D[{t,u,-Sqrt[c-t^2-u^2]},{t,-Sqrt[c],Sqrt[c]},{u,-Sqrt[c],Sqrt[c]},Mesh->None,Axes->True, AxesOrigin->{0,0,0},Boxed->False,PlotRange->{-scalemax/3,scalemax/3}]
xaxispointofcut[c_]:=Graphics3D[{PointSize[Large],Red,Point[{Sqrt[c],0,0}]}]
Manipulate[Show[wcutupper[w],wcutlower[w],xaxispointofcut[w]],{w,.001,4}]

We do the same now for w=f(x,y,z)=(x^2)+(y^2)-(z^2).  Again, we cannot actually “see” the graph of this function as it lives in 4-dimensional space.  However, we can “cut” through it with horizontal sections and slices by thinking of the floor of (ℝ^4) as the 3-dimensional  x y z -space and w as the height over it.  So what do the contours (the projections of the sections back into x y z -space) look like?

wnewcutupper[c_]:= ParametricPlot3D[{t,u,Sqrt[c+t^2+u^2]},{t,-4,4},{u,-4,4},Mesh->None,Axes->True, AxesOrigin->{0,0,0},Boxed->False,PlotRange->{-scalemax/3,scalemax/3}]
wnewcutlower[c_]:= ParametricPlot3D[{t,u,-Sqrt[c+t^2+u^2]},{t,-4,4},{u,-4,4},Mesh->None,Axes->True, AxesOrigin->{0,0,0},Boxed->False,PlotRange->{-scalemax/3,scalemax/3}]
Manipulate[Show[wnewcutupper[t],wnewcutlower[t]],{t,-2,4}]

Here, we play with the 3-dimensional version of the contour plot, CountourPlot3D to view the level sets of w=f(x,y,z)=(x^2)+(y^2)-(z^2).

ContourPlot3D[x^2+y^2-z^2,{x,-scalemax-4,scalemax+4},{y,-scalemax-4,scalemax+4},{z,-scalemax,scalemax},Contours->{-40,0,40},Mesh->None,Axes->True,AxesOrigin->{0,0,0},Boxed->False,ContourStyle->Directive[Opacity[0.6]]]