Removing n points from the plane leaves a space whose fundamental group π₁(ℝ²∖{p₁,…,pₙ}) is the free group Fₙ on n generators a, b, c, … — one loop encircling each puncture once, counter-clockwise.
Any closed loop based at a fixed point is homotopic
to a word a^w1 b^w2 c^w3 ... in these generators.
w_i = winding number of the loop around puncture i
= (1/2π) ∮ dθ_i (signed angle swept around p_i)
This simulator literally builds that loop on a flat 2D canvas: it visits each puncture in order, circles it |wi| times (direction = sign of wi), and returns to a shared basepoint on the outer arc. Because every puncture gets its own letter, the resulting word is already reduced — no adjacent generator ever cancels its own inverse.
- Winding numbers wi are recomputed every rebuild directly from the sampled plane curve — by summing the signed angle swept around each puncture and dividing by 2π — not just read off the controls, so the readout is a genuine numeric measurement.
- Auto-deform continuously bends the loop's outer arc radius, a real homotopy in the plane that never crosses a puncture. The winding numbers — and hence the free-group word — stay exactly the same integers throughout, because they are a topological invariant of the loop's class, not of its shape.
- Self-crossings, by contrast, is not invariant: the same homotopy class can be drawn with a different number of self-intersections, and deforming the loop changes that count live while the winding numbers refuse to move.
Real-world relevance: this exact construction — free groups generated by loops around obstacles — underlies motion planning around obstacles, braid groups, and why a robot arm's cable can get "topologically stuck" no matter how it's wiggled.