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(f, rRange, tRange,
                     rSteps, tSteps, coord) ==

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

    coord = “polar” => polar2Complex                       pair into a complex number
  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] ])

                                                           Add an invisible point at

  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
  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