« home

Torus Fundamental Domain

physicsstring theorytopologygeometrymodular invariancefundamental domainsymmetriescetztikz

The light gray-shaded areas show a fundamental domain of a torus under modular transformations. The diagram shows the region in the complex plane that uniquely parametrizes inequivalent tori, bounded by the modular projective special linear group PSL(2,Z) transformations that identify physically equivalent fundamental domains for the action of Γ\Gamma on the upper half-plane.


Torus Fundamental Domain

  Download

PNGPDFSVG

  Code

  LaTeX

torus-fundamental-domain.tex (38 lines)

\documentclass[tikz,svgnames]{standalone}

\usetikzlibrary{backgrounds}

\begin{document}

\begin{tikzpicture}[scale=3]
  \def\xmin{-1} \def\xmax{1}
  \def\ymin{-0.1} \def\ymax{2}

  \draw [thick,->] (\xmin,0) -- (\xmax,0);
  \draw [thick,->] (0,\ymin) -- (0,\ymax);

  \draw [thick] (-0.5,-0.02) -- (-0.5,0.02) node [below=2] {$-\frac{1}{2}$};
  \draw [thick] (0.5,-0.02) -- (0.5,0.02) node [below=2] {$\frac{1}{2}$};
  \draw [thick] (-0.02,1) -- (0.02,1) node [below right=-2] {$i$};
  \node at (0,3*\ymax/4) [right] {$F_0$};
  \node at (0,0.8) [left] {$F_0^\prime$};

  \begin{pgfonlayer}{background}
    \draw [DarkBlue,->] (-0.5,0) -- (-0.5,\ymax) node [pos=0.7,above left] {$A$};
    \draw [DarkBlue,->] (0.5,0) -- (0.5,\ymax) node [pos=0.7,above right] {$A^\prime$};
    \draw [DarkRed] (1,0) arc (0:180:1) node [auto,swap,pos=0.55] {$B$} node [auto,swap,pos=0.45] {$B^\prime$};
    \draw [DarkGreen] (0,0) arc (0:90:1) node [auto,pos=0.4] {$C$};
    \draw [DarkGreen] (1,1) arc (90:180:1) node [auto,pos=0.6] {$C^\prime$};

    \path[clip] (1,\ymax) -- (1,1) arc (90:180:1) -- (0,0) arc (0:90:1) -- (-1,\ymax) -- cycle;

    \begin{scope}
      \path[clip] (1,\ymax) -- (1,1) arc (90:180:1) -- (0,0) arc (0:90:1) -- (-1,\ymax) -- cycle;
      \fill[gray,opacity=0.3] (-0.5,0) rectangle (0.5,\ymax);
      \fill[gray,opacity=0.6] (1,0) arc (0:180:1);
    \end{scope}
  \end{pgfonlayer}
\end{tikzpicture}

\end{document}

  Typst

torus-fundamental-domain.typ (118 lines)

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

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

#let (xmin, xmax) = (-1, 1)
#let (ymin, ymax) = (-0.5, 2.4)

// Set global styles
#let arrow-style = (
  mark: (end: "stealth", fill: black, scale: 0.2),
  stroke: (thickness: 0.4pt),
)
#set text(size: 8pt)

// TODO this figure needs revisiting to get the gray-shaded areas right without overlaying white fills once CaTZ implements path clipping
// https://github.com/cetz-package/cetz/discussions/813#discussioncomment-12218646
#canvas({
  draw.set-style(stroke: (thickness: 0.4pt))
  draw.set-viewport((0, 0), (20, 20), bounds: (12, 12))


  // Light gray vertical strip
  rect(
    (-0.5, 0),
    (0.5, ymax),
    fill: rgb(128, 128, 128).lighten(80%),
    stroke: none,
  )
  // Draw semicircle B and B' (dark red)
  arc(
    (0, 0),
    radius: 1,
    start: 0deg,
    stop: 180deg,
    stroke: (paint: red),
    fill: gray.transparentize(30%),
    name: "B-arc",
    anchor: "origin",
  )
  // Draw the extended green arcs (C and C') first
  arc(
    (0, 0),
    radius: 1,
    start: 0deg,
    stop: 90deg,
    mode: "PIE",
    stroke: (paint: green),
    fill: white,
    name: "C-arc",
    anchor: "start",
  )
  content("C-arc.20%", $C$, fill: green, anchor: "north-east", padding: 2pt)

  arc(
    (0, 0),
    radius: 1,
    start: 90deg,
    stop: 180deg,
    mode: "PIE",
    stroke: (paint: green),
    fill: white,
    name: "C-prime-arc",
    anchor: "arc-end",
  )
  content("C-prime-arc.25%", $C'$, fill: green, anchor: "north-west", padding: 2pt)
  // Draw semicircle B and B' (dark red)
  arc(
    (0, 0),
    radius: 1,
    start: 0deg,
    stop: 180deg,
    stroke: (paint: red),
    name: "B-arc",
    anchor: "origin",
  )

  // Draw axes
  line((xmin, 0), (xmax, 0), ..arrow-style, name: "x-axis")
  line((0, ymin), (0, ymax), ..arrow-style, name: "y-axis")

  // Draw tick marks with labels
  line((-0.5, -0.02), (-0.5, 0.02), name: "x-tick")
  content((-0.5, -0.1), $-1 / 2$, anchor: "north")

  line((0.5, -0.02), (0.5, 0.02), name: "x-tick")
  content((0.5, -0.1), $1 / 2$, anchor: "north")

  line((-0.02, 1), (0.02, 1), name: "i-tick", stroke: (thickness: 0.6pt))
  content("i-tick", $i$, anchor: "north-west", padding: 1pt)

  content("B-arc.60%", $B$, fill: red, anchor: "south", padding: (0, 0, 3pt))
  content("B-arc.40%", $B'$, fill: red, anchor: "south", padding: (0, 0, 3pt))

  // Draw vertical lines A and A' (dark blue)
  line(
    (-0.5, 0),
    (-0.5, ymax),
    stroke: (paint: blue),
    mark: (end: "stealth", fill: blue, scale: 0.2),
    name: "A-line",
  )
  content("A-line.80%", $A$, fill: blue, anchor: "east", padding: (0, 4pt, 0, 0))

  line(
    (0.5, 0),
    (0.5, ymax),
    stroke: (paint: blue),
    mark: (end: "stealth", fill: blue, scale: 0.2),
    name: "A-prime-line",
  )
  content("A-prime-line.80%", $A'$, fill: blue, anchor: "west", padding: (0, 0, 0, 4pt))

  // Add F₀ labels
  content("y-axis.80%", $F_0$, anchor: "west", padding: (0, 0, 0, 2pt))
  content((rel: (-0.2, -0.2), to: "B-arc.50%"), $F_0'$)
})