« home

Disk to Plane

physicsstring theorytopologygeometrycomplex analysisconformal mappingfundamental domainsymmetriescetztikz

Visualization of the Cayley transform S(w) = (w+i)/(iw+1) mapping the unit disk (D²) to the upper half-plane (H). The diagram shows how points and paths are mapped between these domains, with special points labeled. This conformal transformation is useful in string theory and conformal field theory, where calculations are often simpler in one domain than the other.


Disk to Plane

  Download

PNGPDFSVG

  Code

  LaTeX

disk-to-plane.tex (71 lines)

\documentclass[tikz,svgnames]{standalone}

\usepackage{amsmath,amssymb}

\usetikzlibrary{decorations.markings}

\begin{document}
\begin{tikzpicture}[
    thick, font = \scriptsize,
    circ/.style ={circle, fill = gray, draw = gray, inner sep = 1pt}
  ]

  \def\yaxis{2}
  \draw [<->] (-2, 0) -- (2, 0) node (from)[anchor = west]{$x$};
  \draw [<->] (0, -\yaxis) -- (0, \yaxis) node [anchor = south]{$y$};
  \draw [->] (from) (2.75,0) --++(0:1.5) node [anchor = south, midway]{$\begin{aligned}
        z & = S(w) \\
          & =\textstyle \frac{w + i}{i w + 1}
      \end{aligned}$};

  \node (CI) at (0, 0) [circ, fill = gray, opacity = 0.1, minimum size = \yaxis cm]{};

  \begin{scope}[decoration={
          markings,
          mark=at position 0.25 with {\arrow{>}},
          mark=at position 0.75 with {\arrow{>}}}
    ]
    \draw[DarkBlue,postaction={decorate}] (0,-1) arc (-90:90:1);
    \draw[DarkRed,postaction={decorate}] (0,-1) arc (270:90:1);
  \end{scope}

  \node [pin={[pin distance=30,inner sep=1pt]20:$w_0 = 0$}] {};
  \node at (CI.east) [anchor = north] {$w_1 = 1$};
  \node at (CI.south) [anchor = west] {$w_2 = -i$};
  \node at (CI.west) [anchor = north] {$w_3 = -1$};
  \node at (CI.north) [anchor = south west] {$w_4 = i$};
  \node at (CI.110) [anchor = north east, below = 2pt]{$\mathbb{D}^2$};

  \foreach \x in {west, center, east, south, north}{
      \node [circ] at (CI.\x) {};
    };

  \begin{scope}[xshift = 7cm]
    \draw [<->] (-\yaxis, 0) -- (\yaxis, 0) node [anchor = west,text = black]{$u$};
    \draw [<->] (0, -\yaxis) -- (0, \yaxis) node [anchor = south] {$v$};

    \begin{scope}[decoration={
            markings,
            mark=at position 0.3 with {\arrow{>}},
            mark=at position 0.8 with {\arrow{>}}}
      ]
      \draw[DarkRed,postaction={decorate}] (0,0) -- (-2,0);
      \draw[DarkBlue,postaction={decorate}] (0,0) -- (2,0);
    \end{scope}

    \node at (0,1) [anchor = west]{$z_0 = i$};
    \node at (1,0) [anchor = north]{$z_1 = 1$};
    \node [pin={[pin distance=15,inner sep=0pt]130:$z_2 = 0$}] {};
    \node at (-1,0) [anchor = north]{$z_3 = -1$};
    \node at (0,2) [anchor = west]{$z_4 = +i \infty$};
    \node at (0, 1) [circ]{};
    \foreach \x in {-1, 0, 1}{
        \node at (\x, 0) [circ]{};
      }

    \fill [fill = gray, opacity = 0.1] (-2, 0) rectangle (2, 2);
    \node at (-2, 2) [anchor = north west]{$\mathbb{H}$};
  \end{scope}
\end{tikzpicture}
\end{document}

  Typst

disk-to-plane.typ (150 lines)

#import "@preview/cetz:0.3.4": canvas, draw
#import draw: circle, line, content, arc, rect

#set page(width: auto, height: auto, margin: 8pt)

#let radius = 1
#let axis-length = 2.5
#let arrow-sep = 3.5
#let arrow-width = 1.5
#let x-shift = 8.5

#let dot-style = (fill: gray, radius: 0.08, stroke: none)
#let arrow-style = (
  mark: (end: "stealth", fill: black, scale: 0.7),
  stroke: 0.8pt,
)
#let arc-arrow = (
  mark: (
    end: (
      (pos: 25%, symbol: "barbed", fill: none, scale: 0.7),
      (pos: 75%, symbol: "barbed", fill: none, scale: 0.7),
    ),
  ),
  stroke: 0.8pt,
)

#canvas({
  // Left coordinate system (disk)
  line((-axis-length, 0), (axis-length, 0), ..arrow-style, name: "x-axis")
  content("x-axis.end", $x$, anchor: "west", padding: (0, 3pt, 2pt))
  line((0, -axis-length), (0, axis-length), ..arrow-style, name: "y-axis")
  content("y-axis.end", $y$, anchor: "south", padding: (0, 3pt, 2pt))

  // Transformation arrow and label
  line((arrow-sep, 0), (arrow-sep + arrow-width, 0), ..arrow-style, name: "transform-arrow")
  content(
    (rel: (0, 0), to: "transform-arrow.mid"),
    $z &= S(w)\ &= (w + i) / (i w + 1)$,
    anchor: "south",
    padding: 4pt,
  )

  // Unit disk with gray fill
  circle((0, 0), radius: radius, stroke: 0.8pt, fill: rgb(220, 220, 220).transparentize(60%), name: "disk")
  content((rel: (-0.4, 0.5), to: "disk.center"), $DD^2$)

  // Dots at special points
  circle((0, 0), ..dot-style, name: "w0")
  circle((radius, 0), ..dot-style, name: "w1")
  circle((0, -radius), ..dot-style, name: "w2")
  circle((-radius, 0), ..dot-style, name: "w3")
  circle((0, radius), ..dot-style, name: "w4")

  // Labels for points
  content((rel: (2, 1), to: "w0"), $w_0 = 0$, name: "w0-label")
  line("w0-label", "w0", stroke: gray + 0.5pt)
  content((rel: (0.3, -0.3), to: "w1"), $w_1 = 1$)
  content((rel: (.8, -0.2), to: "w2"), $w_2 = -i$)
  content((rel: (-0.2, -0.3), to: "w3"), $w_3 = -1$)
  content((rel: (0.2, 0.3), to: "w4"), $w_4 = i$, anchor: "west")

  // Blue and red semicircles with arrows at 0.25 and 0.75
  arc(
    (-radius, 0),
    radius: radius,
    start: 270deg,
    stop: 90deg,
    stroke: blue + 1.2pt,
    anchor: "arc-center",
    mark: (
      end: (
        (pos: 25%, symbol: "barbed", fill: blue, scale: 0.7, shorten-to: none),
        (pos: 75%, symbol: "barbed", fill: blue, scale: 0.7, shorten-to: none),
      ),
    ),
    name: "blue-arc",
  )
  arc(
    (radius, 0),
    radius: radius,
    start: -90deg,
    stop: 90deg,
    stroke: red + 0.8pt,
    anchor: "arc-center",
    mark: (
      end: (
        (pos: 25%, symbol: "barbed", fill: red, scale: 0.7, shorten-to: none),
        (pos: 75%, symbol: "barbed", fill: red, scale: 0.7, shorten-to: none),
      ),
    ),
    name: "red-arc",
  )

  // Right coordinate system (upper half-plane)
  line((x-shift - axis-length, 0), (x-shift + axis-length, 0), ..arrow-style, name: "u-axis")
  content("u-axis.end", $u$, anchor: "west", padding: 2pt)
  line((x-shift, -axis-length), (x-shift, axis-length), ..arrow-style, name: "v-axis")
  content("v-axis.end", $v$, anchor: "south", padding: 2pt)

  // Extend blue and red lines to full width
  line(
    (x-shift, 0),
    (x-shift + axis-length, 0),
    stroke: blue + 1.2pt,
    mark: (
      end: (
        (pos: 25%, symbol: "barbed", fill: blue, scale: 0.7, shorten-to: none),
        (pos: 75%, symbol: "barbed", fill: blue, scale: 0.7, shorten-to: none),
      ),
    ),
    name: "pos-real-line",
  )
  line(
    (x-shift, 0),
    (x-shift - axis-length, 0),
    stroke: red + 1.2pt,
    mark: (
      end: (
        (pos: 25%, symbol: "barbed", fill: red, scale: 0.7, shorten-to: none),
        (pos: 75%, symbol: "barbed", fill: red, scale: 0.7, shorten-to: none),
      ),
    ),
    name: "neg-real-line",
  )

  // Upper half-plane with gray fill
  rect(
    (x-shift - axis-length, 0),
    (x-shift + axis-length, axis-length),
    stroke: none,
    fill: rgb(220, 220, 220).transparentize(60%),
    name: "plane",
  )
  content("plane.north-west", $HH$, anchor: "north-west", padding: 4pt)

  // Dots at special points
  circle((x-shift, radius), ..dot-style, name: "z0")
  circle((x-shift + radius, 0), ..dot-style, name: "z1")
  circle((x-shift, 0), ..dot-style, name: "z2")
  circle((x-shift - radius, 0), ..dot-style, name: "z3")

  // Labels for points
  content((rel: (0.2, 0), to: "z0"), $z_0 = i$, anchor: "west")
  content((rel: (0, -0.4), to: "z1"), $z_1 = 1$)
  content((rel: (-1, 0.8), to: "z2"), $z_2 = 0$, name: "z2-label")
  content((rel: (0, -0.4), to: "z3"), $z_3 = -1$)
  content((rel: (0.2, -0.2), to: "v-axis.end"), $z_4 = +i infinity$, anchor: "west")
  line("z2-label", "z2", stroke: gray + 0.5pt)
})