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
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
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] ])
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
c := curryLeft(f,u) direction; curve fixes the
cf := (t:DFLOAT):DFLOAT +-> 0 current value of
makeObject(c,vRange::SEG Float,colorFunction==cf,
Draw the 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
c := curryRight(f,v) direction; curve fixes the
cf := (t:DFLOAT):DFLOAT +-> 1 current value of
makeObject(c,uRange::SEG Float,colorFunction==cf,
Draw the 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
(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
(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@DFLOAT, 0.0@DFLOAT, 1.0@DFLOAT, 4.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