本文转载自技术博客, 如需获取更多相关信息请参见原文。
齐次坐标系
假设在欧式平面上我们有一个点
(
x
,
y
)
(x,y)
(x,y)。如果我们想在投影平面上表示这个点,我们仅需要在末尾为其添加第三个坐标1:
(
x
,
y
,
1
)
(x,y,1)
(x,y,1)。总体而言缩放并不重要,因此点
(
x
,
y
,
1
)
(x,y,1)
(x,y,1)同
(
α
x
,
α
y
,
α
)
(\alpha x, \alpha y, \alpha)
(αx,αy,α)对于所有
α
\alpha
α不为零的情况都表示同一个点。换句话说,
(
X
,
Y
,
W
)
=
(
α
X
,
α
Y
,
α
W
)
(X, Y, W) = (\alpha X, \alpha Y, \alpha W)
(X,Y,W)=(αX,αY,αW)
任何情况下
α
≠
0
\alpha \neq 0
α=0(因此点
(
0
,
0
,
0
)
(0, 0, 0)
(0,0,0)是不存在的)。由于缩放不重要,坐标点
(
X
,
Y
,
W
)
(X, Y, W)
(X,Y,W)被称为齐次坐标系上的点。在本次讨论中,我们使用大写字母来表示齐次坐标系下的点,同时本文中齐次坐标表达
(
X
,
Y
,
W
)
(X, Y, W)
(X,Y,W)同向量表达
[
X
,
Y
,
W
]
T
[X, Y, W]^T
[X,Y,W]T可互换使用。
为表示映射平面中的一条线,我们从线的标准欧拉公式开始:
a
x
+
b
y
+
c
=
0
,
ax + by + c = 0,
ax+by+c=0,
根据方程不受缩放影响这一特性,可得出以下公式:
a
X
+
b
Y
+
c
W
=
0
u
T
p
=
p
T
u
=
0
\begin{aligned} &aX + bY + cW = 0\\ &u^Tp = p^Tu = 0 \end{aligned}
aX+bY+cW=0uTp=pTu=0
此处
u
=
[
a
,
b
,
c
]
T
u = [a, b, c]^T
u=[a,b,c]T表示线且
p
=
[
X
,
Y
,
W
]
T
p=[X,Y,W]^T
p=[X,Y,W]T表示线上的点。因此我们看到点和线在映射平面上具有相同的表达。线的参数也非常易于理解:
−
a
b
-\frac{a}{b}
−ba表示斜率,
−
c
a
-\frac{c}{a}
−ac表示X轴的截距,
−
f
r
a
c
c
b
-frac{c}{b}
−fraccb表示Y轴的截距。
将映射平面上的点转换回欧式空间,我们仅需要除以第三个维度: ( x , y ) = ( X W , Y W ) (x,y) = (\frac{X}{W}, \frac{Y}{W}) (x,y)=(WX,WY)。我们可以很清楚的看到映射平面拥有比欧式空间更多的点——那就是第三个维度为0的点。这些点被称为理想点或无穷远点。在平面的任何一个方向上都有一个单独的理想点。例如点 ( 1 , 0 , 0 ) (1,0,0) (1,0,0)和点 ( 0 , 1 , 0 ) (0,1,0) (0,1,0)分别表示水平和垂直方向。理想点和 P 2 P^2 P2中的其它点一样并未做任何特殊处理。所有理想点所处的线被称为理想线或无穷远线,同样理想线也同普通线没有区别。理想线可表示为 ( 0 , 0 , 1 ) (0,0,1) (0,0,1)。
假设我们希望找到两条线的交线。通过初等代数的知识,两条线 u 1 = ( a 1 , b 1 , c 1 ) u_1 = (a_1,b_1,c_1) u1=(a1,b1,c1)且 u 2 = ( a 2 , b 2 , c 2 ) u_2 = (a_2, b_2, c_2) u2=(a2,b2,c2)会相交于点 p = ( b 1 c 2 − b 2 c 1 , a 2 c 1 − a 1 c 2 , a 1 b 2 − a 2 b 1 ) . p = (b_1c_2 - b_2c_1, a_2c_1 - a_1c_2, a_1b_2 - a_2b_1). p=(b1c2−b2c1,a2c1−a1c2,a1b2−a2b1).这个公式用叉乘计算更容易记忆: p = u 1 × u 2 p = u_1 \times u_2 p=u1×u2。如果两条线是平行的,则有 a 1 b 1 = a 2 b 2 \frac{a_1}{b_1} = \frac{a_2}{b_2} b1a1=b2a2,此时交点为 ( b 1 c 2 − b 2 c 1 , a 2 c 1 − a 1 c 2 , 0 ) (b_1c_2 - b_2c_1, a_2c_1 - a_1c_2, 0) (b1c2−b2c1,a2c1−a1c2,0),这是一个理想点且线的斜率为 − a 1 b 1 -\frac{a_1}{b_1} −b1a1。相似地,给定两个点 p 1 p_1 p1和 p 2 p_2 p2,穿过这两个点的线方程可由 u = p 1 × p 2 u = p_1 \times p2 u=p1×p2获取。
现在假设我们想计算
p
1
,
p
2
,
p
3
p_1, p_2, p_3
p1,p2,p3这三个点是否共线。先有前两个点计算传过它们的线
p
1
×
p
2
p_1 \times p_2
p1×p2。然后再计算第三个点是否在线上即
p
3
T
(
p
1
×
p
2
)
=
0
p_3^T(p_1 \times p_2) = 0
p3T(p1×p2)=0。或者另一种更简洁的方式是计算包含三个点的
3
×
3
3 \times 3
3×3矩阵的行列式是否为零:
d
e
t
[
p
1
p
2
p
3
]
=
0.
det[p_1 \quad p_2 \quad p_3] = 0.
det[p1p2p3]=0.
相似地三条线
u
1
,
u
2
,
u
3
u_1,u_2,u_3
u1,u2,u3是否相交于同一点,可由下式判定:
d
e
t
[
u
1
u
2
u
3
]
=
0.
det[u_1 \quad u_2 \quad u_3] = 0.
det[u1u2u3]=0.
齐次坐标系的概念已经在图2中总结了。进一步阅读可参阅Guibas的日志[3].
例一,给定两条线
u
1
=
(
4
,
2
,
2
)
u_1 = (4,2,2)
u1=(4,2,2)和
u
2
=
(
6
,
5
,
1
)
u_2 = (6,5,1)
u2=(6,5,1),它们的交点可如下计算出:
例2,计算一个双曲线
x
y
=
1
xy = 1
xy=1与水平线
y
=
1
y = 1
y=1的交点。
为将其转换入齐次坐标系,设
X
=
W
x
X = Wx
X=Wx且
Y
=
W
y
Y = Wy
Y=Wy,
可得
X
Y
=
W
2
XY = W^2
XY=W2的双曲线和
Y
=
W
Y=W
Y=W的水平线。
这个方程的解为
(
W
,
W
,
W
)
(W,W,W)
(W,W,W),同欧式空间中的点
(
1
,
1
)
(1,1)
(1,1)表示的是同一个点就是我们想要的解。