The Riemann Sphere as a Stereographic Projection

CaptionResourceCreateNotebook

The Riemann sphere is a geometric representation of the extended complex plane (the complex numbers with the added point at infinity, ℂ⋃{∞}). To visualize this compactification of the complex numbers (transformation of a topological space into a compact space), one can perform a stereographic projection of the unit sphere onto the complex plane as follows: for each point in the z plane, connect a line from z to a designated point that intersects both the sphere and the complex plane exactly once. In this Demonstration, the unit sphere is centered at (0,0,1), and the stereographic projection is from the "north pole" of the sphere at (0,0,2). You can interact with this projection in a variety of ways: "unwrapping" the sphere, showing stereographic projection lines, viewing the image of a set of points on the sphere under the projection, and picking a curve to view the image under the projection. The rainbow coloring on the sphere is a convenient visual tool for comparing where points on the sphere map to on the plane under the projection.

Initialization CodeResourceCreateNotebook

(* Initialization code *)
sphere[s_,t_]={Sqrt[1-(s-1)^2] Cos[t],Sqrt[1-(s-1)^2]Sin[t],s};
complexplane[x_,y_]={x,y,-0.001};

complexplaneplot=ParametricPlot3D[complexplane[x,y],{x,-15,15},{y,-15,15},PlotStyle->{LightGray},Mesh->29,MeshStyle->LightRed];

sphereplot=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[z]]];
sphereplotnomesh=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[z]],Mesh->False];
sphereplotopacity=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[z]],PlotStyle->Opacity[.5]];
sphereplotopacitynomesh=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[z]],PlotStyle->Opacity[.5],Mesh->False];

yellowsphereplot=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[.1]]];
yellowsphereplotopacity=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[.1]],PlotStyle->Opacity[.5]];
yellowsphereplotnomesh=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[.1]],Mesh->False];
yellowsphereplotopacitynomesh=ParametricPlot3D[sphere[s,t],{t,0,2Pi},{s,0,2},ColorFunction->Function[{x,y,z},Hue[.1]],PlotStyle->Opacity[.5],Mesh->False];

(* For any given {s,t} pair, projectionline[u,s,t] is a line P + u V that connects {0,0,2} to the sphere at the point sphere[s,t] *)
projectionline[u_,s_,t_]=Simplify[{0,0,2}+u (sphere[s,t]-{0,0,2})];

(* Next find when the z-component of tangentline[u,s,t] is 0 in terms of u *)
Solve[projectionline[u,s,t][[3]]==0,u];

(* Plug u->(1/(1-s)) into projectionline[u,s,t] to find the point on z = 0 associated with its corresponding point on the sphere, sphere[s,t] *)
projectionline[-(2/(-2+s)),s,t];

(* Finally, rescale the lines so that any particular line starts at sphere[s,t] and moves to z = 0 as a new parameter, v, varies from 0 to 1. *)
surface[v_,s_,t_]=Simplify[sphere[s,t]+v (projectionline[-(2/(-2+s)),s,t]-sphere[s,t])];

(* Next, we will map some parametric curves (f(t),g(t)) between the complex plane and the Riemann sphere using the following techniques;
For the line: Solve[Simplify[surface[1,s,t]]=={w,w-3,0},{s,t}];
For the circle: Solve[Simplify[surface[1,s,t]]=={Cos[w]+2,Sin[w],0},{s,t}];
For the parabola: Solve[Simplify[surface[1,s,t]]=={w^2+1,w,0},{s,t}];
For the hyperbola: Solve[Simplify[surface[1,s,t]]=={Tan[w],Sec[w],0},{s,t}]; *)
riemannline1[u_,w_]=surface[u,((2 (9-6 w+2 (w^2)))/(13-6 w+2 (w^2))),-ArcCos[-(w/(Sqrt[9-6 w+2 (w^2)]))]];
riemannline2[u_,w_]=surface[u,((2 (9-6 w+2 (w^2)))/(13-6 w+2 (w^2))),ArcCos[-(w/(Sqrt[9-6 w+2 (w^2)]))]];
riemanncircle1[u_,w_]=surface[u,((2 (5+4 Cos[w]))/(9+4 Cos[w])),-ArcCos[-((2+Cos[w])/(Sqrt[4+4 Cos[w]+((Cos[w])^2)+((Sin[w])^2)]))]];
riemanncircle2[u_,w_]=surface[u,((2 (5+4 Cos[w]))/(9+4 Cos[w])),ArcCos[-((2+Cos[w])/(Sqrt[4+4 Cos[w]+((Cos[w])^2)+((Sin[w])^2)]))]];
riemannparabola1[u_,w_]=surface[u,((2 (1+3 (w^2)+(w^4)))/(5+3 (w^2)+(w^4))),-ArcCos[-((1+(w^2))/(Sqrt[1+3 (w^2)+(w^4)]))]];
riemannparabola2[u_,w_]=surface[u,((2 (1+3 (w^2)+(w^4)))/(5+3 (w^2)+(w^4))),ArcCos[-((1+(w^2))/(Sqrt[1+3 (w^2)+(w^4)]))]];
riemannhyperbola1[u_,w_]=surface[u,-((2 (-3+Cos[2 w]))/(7+3 Cos[2 w])),-ArcCos[-((Tan[w])/(Sqrt[((Sec[w])^2)+((Tan[w])^2)]))]];
riemannhyperbola2[u_,w_]=surface[u,-((2 (-3+Cos[2 w]))/(7+3 Cos[2 w])),ArcCos[((Tan[w])/(Sqrt[((Sec[w])^2)+((Tan[w])^2)]))]];

ManipulateResourceCreateNotebook

Manipulate[

Show[
Which[showcurve=="none",
Graphics3D[Point[{0,0,0}]],
showcurve=="line",
Show[ParametricPlot3D[riemannline1[1,w],{w,3,30},PlotStyle->{Red,Thickness[curvethickness]}],
ParametricPlot3D[riemannline2[1,w],{w,-30,3},PlotStyle->{Red,Thickness[curvethickness]}],ParametricPlot3D[riemannline1[0,w],{w,3,30},PlotStyle->{Red,Thickness[curvethickness]}],
ParametricPlot3D[riemannline2[0,w],{w,-30,3},PlotStyle->{Red,Thickness[curvethickness]}],
ParametricPlot3D[riemannline1[v,w],{w,3,30},PlotStyle->{Red,Thickness[curvethickness]}],
ParametricPlot3D[riemannline2[v,w],{w,-30,3},PlotStyle->{Red,Thickness[curvethickness]}],
If[showcurvelines==False,Graphics3D[Point[{0,0,0}]],Join[Table[Graphics3D[Line[{{0,0,2},riemannline2[v,j]}]],{j,-30,3,0.5}],Table[Graphics3D[Line[{{0,0,2},riemannline1[v,j]}]],{j,3,30,0.5}]]]
],
showcurve=="circle",
Show[ParametricPlot3D[{riemanncircle1[1,w],riemanncircle2[1,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemanncircle1[0,w],riemanncircle2[0,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemanncircle1[v,w],riemanncircle2[v,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],
If[showcurvelines==False,Graphics3D[Point[{0,0,0}]],Join[Table[Graphics3D[Line[{{0,0,2},riemanncircle1[v,j]}]],{j,0,30,1}],Table[Graphics3D[Line[{{0,0,2},riemanncircle2[v,j]}]],{j,0,30,1}]]]
],
showcurve=="parabola",
Show[ParametricPlot3D[{riemannparabola1[1,w],riemannparabola2[1,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemannparabola1[0,w],riemannparabola2[0,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemannparabola1[v,w],riemannparabola2[v,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],
If[showcurvelines==False,Graphics3D[Point[{0,0,0}]],Join[Table[Graphics3D[Line[{{0,0,2},riemannparabola1[v,j]}]],{j,0,30,1}],Table[Graphics3D[Line[{{0,0,2},riemannparabola2[v,j]}]],{j,0,30,1}]]]
],
showcurve=="hyperbola",
Show[ParametricPlot3D[{riemannhyperbola1[1,w],riemannhyperbola2[1,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemannhyperbola1[0,w],riemannhyperbola2[0,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],ParametricPlot3D[{riemannhyperbola1[v,w],riemannhyperbola2[v,w]},{w,0,30},PlotStyle->{{Red,Thickness[curvethickness]},{Red,Thickness[curvethickness]}}],
If[showcurvelines==False,Graphics3D[Point[{0,0,0}]],Join[Table[Graphics3D[Line[{{0,0,2},riemannhyperbola1[v,j]}]],{j,0,30,1}],Table[Graphics3D[Line[{{0,0,2},riemannhyperbola2[v,j]}]],{j,0,30,1}]]]]
],

If[showpoints==True,Table[Graphics3D[{If[showpointcolor==True,Hue[s/2],Black],PointSize[pointsize],Point[surface[v,s,t]]}],{t,0,2 Pi,tjumppoints},{s,0.0001,1.9999,sjumppoints}],Graphics3D[Point[{0,0,0}]]],

If[showlines==True,Table[Graphics3D[{If[showcolor==True,Hue[s/2],Black],Thickness[linethickness],Line[{{0,0,2},surface[v,s,t]}]}],{t,0,2 Pi,tjumplines},{s,0.00001,1.9999,sjumplines}],Graphics3D[Point[{0,0,0}]]],

If[showaxes==True,Graphics3D[{Thickness[.008],Style[Text["∞",{0,0,2.5-zoom/10}],16],Style[Text["Im",{0,3/zoom,.3}],{12,Bold}],Style[Text["Re",{3/zoom,0,.3}],{12,Bold}],InfiniteLine[{0,0,0},{1,0,0}],InfiniteLine[{0,0,0},{0,1,0}]}],Graphics3D[Point[{0,0,0}]]],

If[showcomplexplane==True,complexplaneplot,Graphics3D[Point[{0,0,0}]]],

Which[showsphere==True&&showmesh==True&&opacity==False&&colorsphere==True,
sphereplot,
showsphere==True&&showmesh==False&&opacity==False&&colorsphere==True, 
sphereplotnomesh,
showsphere==True&&showmesh==True&&opacity==True&&colorsphere==True,
sphereplotopacity,
showsphere==True&&showmesh==False&&opacity==True&&colorsphere==True,
sphereplotopacitynomesh,
showsphere==True&&showmesh==True&&opacity==False&&colorsphere==False, 
yellowsphereplot,
showsphere==True&&showmesh==False&&opacity==False&&colorsphere==False, 
yellowsphereplotnomesh,
showsphere==True&&showmesh==True&&opacity==True&&colorsphere==False, 
yellowsphereplotopacity,
showsphere==True&&showmesh==False&&opacity==True&&colorsphere==False, 
yellowsphereplotopacitynomesh,
showsphere==False,
Graphics3D[Point[{0,0,0}]]],

If[showsurface==True,ParametricPlot3D[surface[v,s,t],{s,0.00001,1.99},{t,0,2 Pi},ColorFunction->Function[{x,y,z},If[colorsphere==True,Hue[z],Hue[.1]]],PlotStyle->Opacity[If[opacity==False,1,.5]],Mesh->If[showmesh==True,True,False]],Graphics3D[Point[{0,0,0}]]],

PlotRange->{{-3/zoom,3/zoom},{-3/zoom,3/zoom},{-0.2,2}},
ImageSize->{360,400},
SphericalRegion->False,
Background->LightYellow,
ViewPoint->{5,-5,4},
Boxed->False,
Axes->False
],

Control[{{v,0,"unwrap sphere"},0,0.99,ImageSize->490,ControlType->Animator, AnimationRunning->False,ControlPlacement->Top}],
Delimiter,
Column[{Row[{Control[{{showcomplexplane,True,"complex plane  "},{True,False}}],Control[{{showaxes,True,"   axes/labels         "},{True,False}}]}],
Row[{Control[{{showsurface,True,"surface              "},{True,False}}],Control[{{showsphere,True,"   Riemann sphere"},{True,False}}]}],
Row[{Control[{{colorsphere,True,"rainbow colors "},{True,False}}],Control[{{showmesh,True,"   mesh                  "},{True,False}}]}],
Row[{Control[{{zoom,4/3,"zoom"},7/3,1/3,ImageSize->Tiny}],Control[{{opacity,False,"   translucent  "},{True,False}}]}]
}],
Delimiter,Column[{Row[{Control[{{showcurve,"none","show curve"},{"none","line","circle","parabola","hyperbola"},ControlType->PopupMenu,ImageSize->{79,20}}]}],
Row[{Control[{{curvethickness,0.008,"curve thickness"},.008,.03,ImageSize->Tiny}]}],
Row[{Control[{{showcurvelines,False,"projection lines on curve"},{True,False}}]}]
}],
Delimiter,Column[{Row[{Control[{{showpoints,False,"sample points on sphere "},{True,False}}]}],
Row[{Control[{{showpointcolor,False,"rainbow colors on points"},{True,False}}]}],
Row[{Control[{{pointsize,0.015,"point size            "},.01,.03,ImageSize->Tiny}]}],Row[{Control[{{tjumppoints,Pi/8,"point count (Δθ)"},{Pi/16,Pi/8,Pi/6,Pi/4,Pi/2},ControlType->Manipulator,ImageSize->Tiny}]}],Row[{Control[{{sjumppoints,.25,"point count (Δh)"},{.015,.05,.1,.25,.5,1},ControlType->Manipulator,ImageSize->Tiny}]}]}],
Delimiter,
Column[{Row[{Control[{{showlines,False,"stereographic projection lines"},{True,False}}]}],
Row[{Control[{{showcolor,False,"rainbow colors on lines           "},{True,False}}]}],
Row[{Control[{{linethickness,0.001,"line thickness   "},.001,.008,ImageSize->Tiny}]}],Row[{Control[{{tjumplines,Pi/8,"line count (Δθ)"},{Pi/32,Pi/16,Pi/8,Pi/4,Pi/2},ControlType->Manipulator,ImageSize->Tiny}]}],Row[{Control[{{sjumplines,.5,"line count (Δh)"},{.015,.05,.1,.25,.5,1},ControlType->Manipulator,ImageSize->Tiny}]}]}],
ControlPlacement->Left,
SaveDefinitions->True]

SnapshotsResourceCreateNotebook

Source & Additional Information

Contributed ByResourceCreateNotebook

Christopher Grattoni

Details & CitationsResourceCreateNotebook

Snapshot 1: a stereographic projection of a circle between the complex plane and the Riemann sphere that also shows the stereographic projection lines

Snapshot 2: a partially "unwrapped" Riemann sphere under the stereographic projection

Snapshot 3: a visual representation of the bijection between points on the sphere and plane at all points where the stereographic projection is defined, with a selection of stereographic projection lines shown

Snapshot 4: a mapping of a hyperbola on the complex plane onto the sphere under the stereographic projection, which may help to give a bit of intuition about the notion of a "point at infinity"

While this Demonstration is constructed in (ℝ^3), the plane at z=0 is meant to represent the complex plane.

The stereographic projection is constructed as follows: Suppose that ((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0])) is a point on the unit sphere. Then the projection begins by parameterizing a line connecting (0,0,2) and ((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0])): (Subscript[L, 1])(t)=(0,0,2)+t(((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0]))-(0,0,2)). Next is to find at which t value (Subscript[L, 1])(t) intersects the plane at z=0 by solving the equation 0=2+t((Subscript[z, 0])-2) and substituting into (Subscript[L, 1])(t). That is, (Subscript[L, 1])(((-2)/((Subscript[z, 0])-2))) is the point at which (Subscript[L, 1])(t) intersects z=0. Then rescale (Subscript[L, 1])(t) to be (Subscript[L, 2])(s) so that (Subscript[L, 2])(0)=((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0])) and (Subscript[L, 2])(1)= (Subscript[L, 1])(((-2)/((Subscript[z, 0])-2))) by defining (Subscript[L, 2])(s)=((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0]))+s((Subscript[L, 1])(((-2)/((Subscript[z, 0])-2)))-((Subscript[x, 0]),(Subscript[y, 0]),(Subscript[z, 0]))). Parameterize the sphere using (x(u,v),y(u,v),z(u,v)) cylindrical coordinates, and define a parameterized family of surfaces (Subscript[F, s])(u,v)=(x(u,v),y(u,v),z(u,v))+s((Subscript[L, 1])(((-2)/(z(u,v)-2)))-(x(u,v),y(u,v),z(u,v))). This parameterized family of surfaces is such that (Subscript[F, 0])(u,v)= (x(u,v),y(u,v),z(u,v)) is the unit sphere, (Subscript[F, 1])(u,v)=(Subscript[L, 1])(((-2)/(z(u,v)-2))) is the plane z = 0, and (Subscript[F, s])(u,v) is an "in between" surface that allows the Demonstration to visually illustrate the "unwrapping" process with a slider.

An alternative stereographic projection centers the unit sphere at the origin. However, whichever construction is chosen, we obtain a conformal map with a designated "point at infinity." You can get an intuitive or geometric understanding of the "point at infinity" by plotting a parabola or hyperbola.

ReferencesResourceCreateNotebook

References for demonstration.

Submission NotesResourceCreateNotebook

Additional information for the reviewer.

KeywordsResourceCreateNotebook

conformal

conformal map

conformal geometry

stereographic projection

stereographic

Riemann

Riemann sphere

extended complex numbers

extended complex plane

point at infinity

projective

projective geometry

projective space

complex projective line

complex manifold

compactification

one-point compactification

CategoriesResourceCreateNotebook

Related DemonstrationsResourceCreateNotebook

Link to a related demonstration

External LinksResourceCreateNotebook

Mapping Lines and Circles onto the Riemann Sphere

Projecting Graphs of Real-Valued Functions of a Real Variable to the Riemann Sphere

Stereographic Projection

Stereographic Projection

Riemann Sphere

Extended Complex Plane

Related SymbolsResourceCreateNotebook

SymbolName (documented Wolfram Language symbol)

Published DateResourceCreateNotebook

2015-07-02

CompatibilityResourceCreateNotebook

AR SupportResourceCreateNotebook

Wolfram Language VersionResourceCreateNotebook

6

Cloud SupportResourceCreateNotebook