從一句口號到一個地址
上一篇你掙得了說出一句曾聽來像神祕主義的話的權利:平行線真的會相交,交於單獨一個額外的 無窮遠點,每個方向各有一個。我們把一整條 無窮遠線 黏到普通平面上,得到了 射影平面——一個沒有例外的世界:任兩條線都相交,就這樣,沒有但書。那是一個關於什麼東西存在的故事。這一篇要談的是該怎麼把它寫下來,好讓你真的算得出東西。工具就是 齊次座標,而它簡單得令人讚嘆。
整個把戲一口氣就能講完。要替平面上的一個點命名,你平常給兩個數,例如 笛卡兒平面 上的 (3, 4)。齊次座標用三個數,以冒號隔開,例如 [3 : 4 : 1]——而規則是:把三個數同乘以同一個非零倍數,命名的是同一個點。所以 [3 : 4 : 1]、[6 : 8 : 2]、[30 : 40 : 10] 並不是三個點,而是同一個點的三種寫法。點是那個比值,而不是那個三元組。
兩個方向的換算法
要把一個普通點換成它的齊次名字,只要在末尾補一個 1:點 (x, y) 變成 [x : y : 1]。要換回來,就把前兩個座標除以第三個:[x : y : z] 在 z 不為零時,就是普通點 (x/z, y/z)。拿縮放規則驗證一下就會發現處處吻合——[6 : 8 : 2] 除回去得到 (6/2, 8/2) = (3, 4),正是 [3 : 4 : 1] 那個點。第三個座標扮演的是「我們縮放了多少」的記帳員,把它除掉就還原出誠實的位置。
ordinary -> homogeneous: (x, y) becomes [x : y : 1] homogeneous -> ordinary: [x : y : z] with z != 0 becomes (x/z, y/z) scaling rule (the heart): [x : y : z] = [k*x : k*y : k*z] for any k != 0 the point at infinity: [x : y : 0] (no ordinary location; a direction) forbidden: [0 : 0 : 0] (names nothing)
現在來到整個構造當初為之而生的回報。當 z = 0 時會怎樣?你不能除以零,所以 [x : y : 0] 沒有普通的位置——它根本不是舊平面上的點。這些恰恰是那些額外的點,也就是 無窮遠點。而且注意 [x : y : 0] 仍服從縮放規則,所以它只記錄了比值 x : y——也就是一個方向,你朝著奔去的那個斜率。三元組 [1 : 2 : 0] 就是「沿方向 (1, 2) 無限遠處的那個點」。上一篇那句口號,終於變成了一個整齊的地址。
線也得到三個座標
在這裡,圖像變得優美地對稱。普通平面上一條線的方程式長得像 a*x + b*y + c = 0。代入 x = X/Z、y = Y/Z 再整條乘以 Z,它就變成 a*X + b*Y + c*Z = 0——乾淨俐落,沒有分數。所以一條線同樣由三個數 [a : b : c] 捕捉,基於同樣的理由對縮放不變(把方程式乘以 2,描述的還是同一條線)。一個點是一個三元組 [X : Y : Z];一條線也是一個三元組 [a : b : c];而點落在線上,恰恰當 a*X + b*Y + c*Z = 0 成立時。一個對稱的條件,統管了所有的 結合關係。
那一條方程式,不過就是把兩個三元組的內積設為零——若你把 [X : Y : Z] 與 [a : b : c] 讀成 向量 (X, Y, Z) 與 (a, b, c),那麼「點在線上」就恰恰是 (X, Y, Z) . (a, b, c) = 0。霎時間,前面階梯裡那整套向量機器都能派上用場了:要找過兩點的線,或兩線的交點,你取一個外積。線 [a : b : c] 與 [d : e : f] 的交點,就是 (a, b, c) x (d, e, f);而過兩點的線,也用同樣的方法找到。幾何,變成了你早已會的算術。
用數字親眼看兩條平行線相交
我們來兌現一下。取兩條真正平行的線:y = 1 與 y = 2,都是水平線,在普通平面上永不相交。我們要用實際的數字,親眼看它們在無窮遠處相撞——而不是當作一種修辭。先把每一條化成齊次形式,再求解。跟著步驟走,每一步都是你能徒手完成的一行運算。
- 把每條線寫成等於零的方程式。線 y = 1 就是 y - 1 = 0;線 y = 2 就是 y - 2 = 0。
- 齊次化:把 x 換成 X/Z、y 換成 Y/Z,再把 Z 清掉。第一條變成 Y - Z = 0,線座標為 [0 : 1 : -1];第二條變成 Y - 2Z = 0,線座標為 [0 : 1 : -2]。
- 交點 [X : Y : Z] 必須同時滿足兩條方程式。把它們相減:(Y - Z) - (Y - 2Z) = 0 得到 Z = 0。所以交點的 Z = 0——它是一個無窮遠點,正如先前所承諾的。
- 在 Z = 0 之下,第一條方程式 Y - Z = 0 同時逼出 Y = 0,而 X 任意。於是交點是 [X : 0 : 0] = [1 : 0 : 0]:水平方向 (1, 0) 上的無窮遠點。兩條水平線都通過它。
就在那裡,用冷冰冰的算術寫著:兩條平行線相交於 [1 : 0 : 0],那是每一條水平線共享的單一無窮遠點。上一篇的承諾,如今成了你能對任何一對平行線重複施作的計算。而這也正是為什麼我們說無窮遠點就是一個方向:[1 : 0 : 0] 屬於所有水平線、而不屬於其他任何線。平行的線共享一個方向,所以共享它們唯一的無窮遠點;相交的線早已在某個普通點相遇,再各自奔向不同的無窮遠點。
為什麼這個多出來的座標值得
退一步問問:那第三個數,替我們買到了什麼?三樣東西,每一樣都是實打實的回報。第一,沒有例外:「兩點決定一線」與「兩線決定一點」如今都成立、且零個特例,因為在這套系統裡,平行線真的有交點。這樣的對稱不只是優雅而已——它是你下一篇就會遇到的 對偶原理 的種子,在那裡,點與線互換角色。
第二,一切都是線性的。點與線都是三元組;結合是內積;連線與交點是外積。困難的射影問題,塌縮成你早已信賴的線性代數——這也正是電腦繪圖與電腦視覺底層都跑在齊次座標上的原因。第三,也是最不張揚卻最重要的一點:射影變換——那些日後會把一條圓錐曲線送到另一條的映射——化成了作用在這些三元組上的簡單 3 乘 3 矩陣,遠比你在素樸平面上會需要的那些彆扭公式乾淨得多。