Reading and display settings

Appearance

System follows your operating system and keeps following it, even if you change it later. The header's sun, moon and monitor cycle the same three options.

Text size (%) 100%

Default. Scales every text size on the site, equations and tables included.

Reading width 70ch

How much text runs across one line of prose. Narrower is easier to track; wider fits more on screen.

Line spacing 1.6

The leading on body text. Taller leading helps a tired eye stay on the line.

Density

Padding and gaps around controls, cards, and tables — how much breathing room the layout leaves itself.

Motion

System follows your operating system. Reduced removes every transition on this site. Full keeps them on unless your system asks for less.

0

Why ordinary (x, y) isn't enough

Motivation

Two problems keep showing up in camera geometry that ordinary Euclidean coordinates handle badly:

1. Parallel lines "meet" under perspective. Stand on a straight road and look down it — the two edges, parallel in the world, visibly converge to a single point on the horizon in the photo. In plain (x, y) coordinates, parallel lines have no intersection at all; the algebra has a hole exactly where the picture doesn't. 2. Perspective projection is a division, not a matrix multiply. u = f·x/z is not linear in (x, y, z) — you can't write it as a single matrix times a vector, which makes chaining camera transforms (rotate, then translate, then project) painful.

Homogeneous coordinates fix both at once: add one extra coordinate, and every point at infinity becomes an ordinary point, and every perspective divide becomes "multiply by a matrix, then divide once at the very end."

1

Homogeneous coordinates and the meaning of ≅

The core trick

Represent a 2D point (x, y) by a 3-vector x̃ = (x, y, 1). That's a point in P², the projective plane. The rule that makes it work: scale doesn't matter. The vectors (x, y, 1), (2x, 2y, 2), and (−5x, −5y, −5) all represent the same point. Formally, x̃ ≅ ỹ ("equal up to scale") means x̃ = λ ỹ for some nonzero λ. Every symbol ≅ in this series is exactly this: "same object, don't care which representative vector you're holding."

To go back to ordinary coordinates, divide by the last entry: (x, y, w) → (x/w, y/w). This is the "divide once at the end" from above — and it's exactly what u = f·x/z is doing in the pinhole model.

Euclidean → homogeneous: (x, y) ↦ (x, y, 1)
Homogeneous → Euclidean: (x, y, w), w ≠ 0 ↦ (x/w, y/w)
Equivalence: (x, y, w) ≅ (λx, λy, λw) for any λ ≠ 0

Now the trick that solves problem 1 above: what if w = 0? (x, y, 0) has no Euclidean counterpart — dividing by zero is undefined — but it's a perfectly good vector, so it's a perfectly good point of P². These are the points at infinity (or ideal points), one for every direction (x, y) in the plane. Two parallel lines, which never meet in the Euclidean plane, meet exactly at the ideal point in their shared direction. Nothing is undefined anymore — the hole is gone.

💡 Bridge to the rest of the series: a 3D world point is X̃ = (X, Y, Z, 1) ∈ P³ the same way; x̃ = K[R|t]X̃ is a single matrix multiply, and the perspective division only happens once, when you read off pixel coordinates at the very end.
2

Play: a point, its scale-equivalence class, and w → 0

Interactive

🎯 Learning goal: every homogeneous vector on the same ray through the origin is the same point. Watch that ray, and watch what happens as w shrinks toward zero.

Left: a point (x, y) you can drag in the image plane w = 1 (gray), plotted in 3D as (x, y, w)-space. The line through the origin and that point is its entire equivalence class — every point on it is the same projective point. Drag the scale λ slider to slide along that ray and watch the recovered Euclidean point not move. Drag w toward 0 to see the point recede toward infinity in the image plane.

Drag to orbit, scroll to zoom. Gray plane is w = 1 (ordinary image plane); the dashed ray is the equivalence class.

The image plane w = 1: the Euclidean point (x/w, y/w). λ can’t move it — only w can.

Notice: changing λ moves the plotted 3D dot a lot, but the readout's recovered Euclidean point never changes — that's exactly the "don't care which representative" rule. Changing w directly (holding x, y fixed) is different: that's a genuinely different homogeneous vector (x, y, w), so its Euclidean point (x/w, y/w) races off toward infinity as w → 0.

3

Lines, incidence, and duality

The other half of P²

A 2D line ax + by + c = 0 is represented the same way as a point: as a homogeneous 3-vector l = (a, b, c), also only defined up to scale. A point lies on a line exactly when their dot product vanishes:

x̃ lies on l  ⟺  l · x̃ = 0  ⟺  a·x + b·y + c·w = 0

Because points and lines are both just 3-vectors related by the same incidence equation, P² has a beautiful symmetry called duality: any true statement about points and lines stays true if you swap the words "point" ↔ "line" and the operation "intersection" ↔ "join." Two facts fall out of this for free, both computed with a single cross product:

Line through two points x̃₁, x̃₂: l = x̃₁ × x̃₂
Point where lines l₁, l₂ meet: x̃ = l₁ × l₂

Why the cross product works: l = x̃₁ × x̃₂ is by construction orthogonal to both x̃₁ and x̃₂, i.e. l · x̃₁ = l · x̃₂ = 0 — exactly the incidence condition, satisfied for both points at once. This one identity is the entire computational engine behind vanishing points, epipolar lines as l = Fx₁ in Part 6, and much of what looks like magic later in this series.

And it explains ideal points cleanly: two parallel lines l₁, l₂ (same (a, b) direction, different c) cross to give a point with w = 0 — an ideal point, in the direction perpendicular to (a, b), i.e. along the lines themselves. All ideal points together form one line, the line at infinity l∞ = (0, 0, 1), which every ordinary line meets at its own vanishing direction and no other.

4

Play: point ↔ line duality, and lines meeting at infinity

Interactive

🎯 Learning goal: the same cross product builds a line from two points and finds where two lines cross. Watch the crossing point's w-coordinate collapse to 0 as the lines become parallel.

Drag the two colored points to define a line through them (computed as l = x̃₁ × x̃₂). A second, independent line is fixed for comparison; drag its angle slider to rotate it. The readout shows both lines' coefficients and their intersection x̃ = l₁ × l₂, including its raw w — watch w shrink toward zero exactly as the two lines become parallel, and the intersection point fly off-canvas toward infinity.

Drag the two orange handles anywhere — the blue line through them updates live. Click "Snap parallel" to make the fixed line exactly parallel to the draggable one and watch the intersection's w hit (numerically) zero: same direction, no finite meeting point, an ideal point on the line at infinity.

5

What else lives in P² and P³

Just enough to recognize it later

Conics. A conic (ellipse, parabola, circle, pair of lines, ...) is a symmetric 3×3 matrix C with x̃ᵀCx̃ = 0; the absolute conic is the special one that camera calibration recovers. Conics & the absolute conic works it out in full.

P³ and camera projection. The same language generalizes to 3D points, 4-vector planes, and a camera as a 3×4 matrix P with x̃ = PX̃. 3D projective space & Plücker lines takes that up.

The transformation hierarchy. Not every transform of P² is equally destructive — Euclidean, similarity, affine, and projective maps each add degrees of freedom and give up an invariant. The projective transformation hierarchy is the full stratification, including cross-ratio.

✓

Cheat sheet

Recap

ObjectSymbolDefinitionWhere it resurfaces
Homogeneous pointx̃ = (x, y, w)Euclidean point is (x/w, y/w); defined up to scaleEvery x̃ in this series
Scale equivalencea ≅ ba = λb for some λ ≠ 0"Equal up to scale" everywhere: E, F, H, P
Point at infinity(x, y, 0)No Euclidean counterpart; one per directionVanishing points (Part 4), pure rotation (Part 8)
Linel = (a, b, c)Incidence: l · x̃ = 0Epipolar lines l = Fx₁ (Part 6)
Line through 2 pointsl = x̃₁ × x̃₂Cross productVanishing-point construction (Part 4)
Intersection of 2 linesx̃ = l₁ × l₂Cross product (dual of the above)Epipole = null space, computed similarly
Line at infinityl∞ = (0, 0, 1)Contains every ideal pointAffine/metric upgrade (Part 16)
Transformation hierarchyEuclidean ⊂ similarity ⊂ affine ⊂ projective3 / 4 / 6 / 8 DOFHomography (Part 8), calibration
Homogeneous coordinates and duality are the alphabet; the next pages are words. First up: conics, and the absolute conic that camera calibration later pins down. Continue: conics & the absolute conic →