Projective Geometry & Homogeneous Coordinates
Every later part of this series writes things like x̃ = K[R|t]X̃, says two vectors are "equal up to scale" (≅), and pulls lines and intersections out of cross products as if that were obvious. It isn't obvious — it's projective geometry, a different (and, once it clicks, simpler) way of doing geometry where points at infinity are just points, lines and points are interchangeable, and "scale doesn't matter" is a first-class rule rather than an asterisk. This page builds that language from scratch, with nothing assumed from later parts.
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."
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.
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.
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.Play: a point, its scale-equivalence class, and w → 0
Interactive
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.
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:
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:
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.
Play: point ↔ line duality, and lines meeting at infinity
Interactive
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.
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
| Object | Symbol | Definition | Where it resurfaces |
|---|---|---|---|
| Homogeneous point | x̃ = (x, y, w) | Euclidean point is (x/w, y/w); defined up to scale | Every x̃ in this series |
| Scale equivalence | a ≅ b | a = λb for some λ ≠ 0 | "Equal up to scale" everywhere: E, F, H, P |
| Point at infinity | (x, y, 0) | No Euclidean counterpart; one per direction | Vanishing points (Part 4), pure rotation (Part 8) |
| Line | l = (a, b, c) | Incidence: l · x̃ = 0 | Epipolar lines l = Fx₁ (Part 6) |
| Line through 2 points | l = x̃₁ × x̃₂ | Cross product | Vanishing-point construction (Part 4) |
| Intersection of 2 lines | x̃ = l₁ × l₂ | Cross product (dual of the above) | Epipole = null space, computed similarly |
| Line at infinity | l∞ = (0, 0, 1) | Contains every ideal point | Affine/metric upgrade (Part 16) |
| Transformation hierarchy | Euclidean ⊂ similarity ⊂ affine ⊂ projective | 3 / 4 / 6 / 8 DOF | Homography (Part 8), calibration |