Instructions
This notebook is intended to offer a visualization of the Gauss map; hopefully this visualization will help you think about the Weingarten map.

The first step is to compile one of the cells defining a surface.  If you want to create your own, simply copy one of the surface cells and replace the given function and domain with your own.
Once you’ve compiled a cell defining surfaceX, you’re ready to compile the cell under the heading ‘The Gauss map.’ You shouldn’t need to edit that cell.

Note that the Gauss map cell must be recompiled each time you change surfaceX!

A right circular cylinder

RR=2;
surfaceX[u1_,u2_]:={RR*Cos[(u1/RR)],RR*Sin[(u1/RR)],u2};
u1Min=-RR*Pi;u1Max=RR*Pi;u2Min=-2;u2Max=2;

An upward-opening elliptic paraboloid

surfaceX[u1_,u2_]:={u1,u2,(1/2)((u1^2)+(u2^2))};
u1Min=-2;u1Max=2;u2Min=-2;u2Max=2;

A hyperbolic paraboloid

surfaceX[u1_,u2_]:={u1,u2,(1/2)((u1^2)-(u2^2))};
u1Min=-2;u1Max=2;u2Min=-2;u2Max=2;

A downward-opening elliptic paraboloid

surfaceX[u1_,u2_]:={u1,u2,-(1/2)((u1^2)+(u2^2))};
u1Min=-2;u1Max=2;u2Min=-2;u2Max=2;

A torus

RR=5;rr=2;
surfaceX[u1_,u2_]:={Cos[u1]*(RR-rr*Sin[u2]),Sin[u1]*(RR-rr*Sin[u2]),rr*Cos[u2]};
u1Min=-Pi;u1Max=Pi;u2Min=-Pi;u2Max=Pi;

A hyperboloid of one sheet

surfaceX[u1_,u2_]:={(Sqrt[((u2^2)+1)])Cos[u1],(Sqrt[((u2^2)+1)])Sin[u1],u2};
u1Min=-Pi;u1Max=Pi;u2Min=-2;u2Max=2;

The Gauss map
The following cell will produce a Manipulate which allows you to control the parameters (u^1)and (u^2) which are fed into surfaceX.  The output of this Manipulate will show your surface, as well as a copy of the unit sphere (S^2).  The point on the surface determined by your choice of parameters will be displayed as a green dot, and the unit surface normal will be displayed as a red unit vector.  The image of this point under the Gauss map is the point determined by this unit vector, and is displayed on (S^2) as a red dot.

This cell must be recompiled after changing the definition of surfaceX!

u1Mid=(u1Max+u1Min)/2;
u2Mid=(u2Max+u2Min)/2;
x1[u1_,u2_]:=D[surfaceX[uu1,u2],uu1]/.uu1->u1;
x2[u1_,u2_]:=D[surfaceX[u1,uu2],uu2]/.uu2->u2;
surfaceNormal[u1_,u2_]:=Cross[x1[u1,u2],x2[u1,u2]]/Norm[Cross[x1[u1,u2],x2[u1,u2]]];

surfacePlot=ParametricPlot3D[surfaceX[u1,u2],{u1,u1Min,u1Max},{u2,u2Min,u2Max},Mesh->None,Boxed->False,Axes->False,PlotStyle->Opacity[0.5],PlotRangePadding->1];
spherePlot=ParametricPlot3D[{Sin[p]*Cos[t],Sin[p]*Sin[t],Cos[p]},{p,0,Pi},{t,0,2Pi},Mesh->None,Boxed->False,Axes->False,PlotStyle->Opacity[0.5]];

Manipulate[Grid[{{
Show[
surfacePlot,
ListPointPlot3D[{surfaceX[u1,u2]},PlotStyle->{{Green,PointSize[0.03]}}],
Graphics3D[{Red,Arrow[{surfaceX[u1,u2],surfaceX[u1,u2]+surfaceNormal[u1,u2]}]}]
],
Show[
spherePlot,
ListPointPlot3D[{surfaceNormal[u1,u2]},PlotStyle->{{Red,PointSize[0.03]}}],
Graphics3D[{Red,Arrow[{{0,0,0},surfaceNormal[u1,u2]}]}]
]
}},ItemSize->Automatic,BaseStyle->ImageSizeMultipliers->1],{{u1,u1Mid},u1Min,u1Max},{{u2,u2Mid},u2Min,u2Max}]