# 21.8 conformal.input¶

The functions in this section draw conformal maps both on the conformal map plane and on the Riemann sphere. Riemann:sphere

C := Complex DoubleFloat                                   Complex Numbers
S := Segment DoubleFloat                                   Draw ranges

R3 := Point DFLOAT                                         Points in 3-space

conformalDraw(f, rRange, tRange, rSteps, tSteps, coord) draws the image

of the coordinate grid under f in the complex plane. The grid may be given in either polar or Cartesian coordinates. Argument f is the function to draw; rRange is the range of the radius (in polar) or real (in Cartesian); tRange is the range of θ (in polar) or imaginary (in Cartesian); tSteps, rSteps, are the number of intervals in the r and θ directions; and coord is the coordinate system to use (either “polar” or “cartesian”).

conformalDraw: (C -> C, S, S, PI, PI, String) -> VIEW3D
conformalDraw(f,rRange,tRange,rSteps,tSteps,coord) ==


transformC :=                                            Function for changing an (x,y)

coord = “polar” => polar2Complex                       pair into a complex number
cartesian2Complex cm := makeConformalMap(f, transformC)

sp := createThreeSpace()                                 Create a fresh space

adaptGrid(sp, cm, rRange, tRange, rSteps, tSteps)        Plot the coordinate lines

makeViewport3D(sp, “Conformal Map”)                      Draw the image

riemannConformalDraw(f, rRange, tRange, rSteps, tSteps, coord) draws

the image of the coordinate grid under f on the Riemann sphere. The grid may be given in either polar or Cartesian coordinates. Its arguments are the same as those for conformalDraw.

riemannConformalDraw:(C->C,S,S,PI,PI,String)->VIEW3D
riemannConformalDraw(f, rRange, tRange,
rSteps, tSteps, coord) ==


transformC :=                                            Function for changing an (x,y)

coord = “polar” => polar2Complex                       pair into a complex number
cartesian2Complex
sp := createThreeSpace()                                 Create a fresh space
cm := makeRiemannConformalMap(f, transformC)
adaptGrid(sp, cm, rRange, tRange, rSteps, tSteps)        Plot the coordinate lines
curve(sp,[point [0,0,2.0@DFLOAT,0],point [0,0,2.0@DFLOAT,0] ])

makeViewport3D(sp,”Map on the Riemann Sphere”)           the north pole for scaling

adaptGrid(sp, f, uRange, vRange,  uSteps, vSteps) == Plot  the coordinate grid

delU := (hi(uRange) - lo(uRange))/uSteps                 using adaptive plotting for

delV := (hi(vRange) - lo(vRange))/vSteps                 coordinate lines, and draw

uSteps := uSteps + 1; vSteps := vSteps + 1               tubes around the lines
u := lo uRange

for i in 1..uSteps repeat                                Draw coordinate lines in the v

c := curryLeft(f,u)                                    direction; curve c fixes the

cf := (t:DFLOAT):DFLOAT +-> 0                          current value of u
makeObject(c,vRange::SEG Float,colorFunction==cf,
Draw the v coordinate line
space == sp, tubeRadius == .02, tubePoints == 6)   u := u + delU v := lo vRange

for i in 1..vSteps repeat                                Draw coodinate lines in the u

c := curryRight(f,v)                                   direction; curve c fixes the

cf := (t:DFLOAT):DFLOAT +-> 1                          current value of v
makeObject(c,uRange::SEG Float,colorFunction==cf,
Draw the u coordinate line
space == sp, tubeRadius == .02, tubePoints == 6)   v := v + delV void()

riemannTransform(z) ==                                     Map a point in the complex

r := sqrt norm z                                         plane to the Riemann sphere
cosTheta := (real z)/r sinTheta := (imag z)/r cp := 4*r/(4+r^2) sp := sqrt(1-cp*cp) if r>2 then sp := -sp point [cosTheta*cp, sinTheta*cp, -sp + 1]

cartesian2Complex(r:DFLOAT, i:DFLOAT):C ==                 Convert Cartesian coordinates to

complex(r, i)                                            complex Cartesian form

polar2Complex(r:DFLOAT, th:DFLOAT):C ==                    Convert polar coordinates to

complex(r*cos(th), r*sin(th))                            complex Cartesian form

makeConformalMap(f, transformC) ==                         Convert complex function f

(u:DFLOAT,v:DFLOAT):R3 +->                               to a mapping:

(DFLOAT,DFLOAT) ↦ R3

z := f transformC(u, v)                                in the complex plane
point [real z, imag z, 0.0@DFLOAT]

makeRiemannConformalMap(f, transformC) ==                  Convert a complex function f

(u:DFLOAT, v:DFLOAT):R3 +->                              to a mapping:

(DFLOAT,DFLOAT) ↦ R3

riemannTransform f transformC(u, v)                    on the Riemann sphere
riemannSphereDraw: (S, S, PI, PI, String) -> VIEW3D

Draw a picture of the mapping

of the complex plane to

the Riemann sphere
riemannSphereDraw(rRange,tRange,rSteps,tSteps,coord) ==   transformC :=     coord = “polar” => polar2Complex     cartesian2Complex
grid := (u:DFLOAT, v:DFLOAT): R3 +->                     Coordinate grid function
z1 := transformC(u, v) point [real z1, imag z1, 0]

sp := createThreeSpace()                                 Create a fresh space

adaptGrid(sp, grid, rRange, tRange, rSteps, tSteps)      Draw the flat grid
connectingLines(sp,grid,rRange,tRange,rSteps,tSteps)
makeObject(riemannSphere,0..2*%pi,0..%pi,space==sp)      Draw the sphere
f := (z:C):C +-> z cm := makeRiemannConformalMap(f, transformC)
adaptGrid(sp, cm, rRange, tRange, rSteps, tSteps)        Draw the sphere grid

makeViewport3D(sp, “Riemann Sphere”)

connectingLines(sp,f,uRange,vRange,uSteps,vSteps) ==

Draw the lines that connect

delU := (hi(uRange) - lo(uRange))/uSteps                 the points in the complex

delV := (hi(vRange) - lo(vRange))/vSteps                 plane to the north pole

uSteps := uSteps + 1; vSteps := vSteps + 1               of the Riemann sphere
u := lo uRange for i in 1..uSteps repeat                                For each u   v := lo vRange   for j in 1..vSteps repeat                              For each v     p1 := f(u,v)

p2 := riemannTransform complex(p1.1, p1.2)           Project p1 onto the sphere

fun := lineFromTo(p1,p2)                             Create a line function
cf := (t:DFLOAT):DFLOAT +-> 3
makeObject(fun, 0..1,space==sp,tubePoints==4,        Draw the connecting line
tubeRadius==0.01,colorFunction==cf)     v := v + delV   u := u + delU void()

riemannSphere(u,v) ==                                      A sphere sitting on the

sv := sin(v)                                             complex plane, with radius 1
0.99@DFLOAT*(point [cos(u)*sv,sin(u)*sv,cos(v),0.0@DFLOAT])+   point [0.0@DFLOAT0.0@DFLOAT1.0@DFLOAT4.0@DFLOAT]

lineFromTo(p1, p2) ==                                      Create a line function

d := p2 - p1                                             that goes from p1 to p2
(t:DFLOAT):Point DFLOAT +->   p1 + t*d