为什么叫齐次坐标系?
齐次坐标系,英文名称Homogeneous coordinate system。谷歌翻译Homogeneous是“同质”的意思,百度翻译结果是“均匀的;同性质的,同类的;由相同(或同类型)事物(或人)组成的;[数]齐性的,齐次的”。
名字很抽象,那我们先从齐次性开始理解。
齐次性定义
在百度百科里的解释:
一般地,在数学里面,如果一个函数的自变量乘以一个系数,那么这个函数将乘以这个系数的k次方,我们称这个函数为k次齐次函数,也就是:如果函数 f(v)满足f(ax)=a^k f(x),其中,x是输入变量,k是整数,a是非零的实数,则称f(x)是k次齐次函数。
比如:一次齐次函数就是线性函数的多项式函数 :f(x,y)=x^2+y^2因为f(ax,ay)=a^2f(x,y),所以f(x,y)是2次齐次函数。
以下摘自维基百科对于齐次坐标系的描述:
在数学里,齐次坐标(homogeneous coordinates),或投影坐标(projective coordinates)是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。该词由奥古斯特·费迪南德·莫比乌斯于1827年在其著作《Der barycentrische Calcul》一书内引入。齐次坐标可让包括无穷远点的点坐标以有限坐标表示。使用齐次坐标的公式通常会比用笛卡儿坐标表示更为简单,且更为对称。齐次坐标有着广泛的应用,包括电脑图形及3D电脑视觉。使用齐次坐标可让电脑进行仿射变换,并通常,其投影变换能简单地使用矩阵来表示。
实投影平面可以看作是一个具有额外点的欧氏平面,这些点称之为无穷远点,并被认为是位于一条新的线上(该线称之为无穷远线)。每一个无穷远点对应至一个方向(由一条线之斜率给出),可非正式地定义为一个点自原点朝该方向移动之极限。在欧氏平面里的平行线可看成会在对应其共同方向之无穷远点上相交。给定欧氏平面上的一点 (x, y),对任意非零实数 Z,三元组 (xZ, yZ, Z) 即称之为该点的齐次坐标。依据定义,将齐次坐标内的数值乘上同一个非零实数,可得到同一点的另一组齐次坐标。例如,笛卡儿坐标上的点 (1,2) 在齐次坐标中即可标示成 (1,2,1) 或 (2,4,2)。原来的笛卡儿坐标可透过将前两个数值除以第三个数值取回。因此,与笛卡儿坐标不同,一个点可以有无限多个齐次坐标表示法。
一条通过原点 (0, 0) 的线之方程可写作 nx + my = 0,其中 n 及 m 不能同时为 0。以参数表示,则能写成 x = mt, y = − nt。令 Z=1/t,则线上的点之笛卡儿坐标可写作 (m/Z, − n/Z)。在齐次坐标下,则写成 (m, − n, Z)。当 t 趋向无限大,亦即点远离原点时,Z 会趋近于 0,而该点的齐次坐标则会变成 (m, −n, 0)。因此,可定义 (m, −n, 0) 为对应 nx + my = 0 这条线之方向的无穷远点之齐次坐标。因为欧氏平面上的每条线都会与透过原点的某一条线平行,且因为平行线会有相同的无穷远点,欧氏平面每条线上的无穷远点都有其齐次坐标。
概括来说:
- 投影平面上的任何点都可以表示成一三元组 (X, Y, Z),称之为该点的'齐次坐标或投影坐标,其中 X、Y 及 Z 不全为 0。
- 以齐次坐标表表示的点,若该坐标内的数值全乘上一相同非零实数,仍会表示该点。
- 相反地,两个齐次坐标表示同一点,当且仅当其中一个齐次坐标可由另一个齐次坐标乘上一相同非零常数得取得。
- 当 Z 不为 0,则该点表示欧氏平面上的该 (X/Z, Y/Z)。
- 当 Z 为 0,则该点表示一无穷远点。
- 注意,三元组 (0, 0, 0) 不表示任何点。原点表示为 (0, 0, 1)。
从上面的描述我们知道齐次坐标是用于投影几何里的坐标系统,和平时我们用的笛卡尔坐标系一样,是帮助我们理解宇宙的工具。但因为这是两种不同的坐标系,我们需要跳出笛卡尔坐标系,以更宏观的思维来理解,不然有些场景会让我们困惑。
首先我们把下方的这个投影描述图印在脑海中。
考虑一个点p,它的笛卡尔坐标是(x,y),齐次坐标是(x,y,1),齐次坐标比笛卡尔坐标多一个维度,按照现在书上和网络上的理解基本都是说笛卡尔坐标系就是齐次坐标系中w=1的那个平面,(x,y,1)是齐次坐标(kx,ky,k)表示的点在w=1上的映射。
无穷远的点
通常使用(∞,∞)表示笛卡尔坐标系下的无穷远的点,所以在笛卡尔坐标系中无穷远的点是没有定义的。而在齐次坐标系统中可以用w=0来表示无穷远的点,即任何(x,y,0)表示无穷远的点。
两条平行线在无限远处相交
笛卡尔坐标系中两条平行线没有交点,即使在三维空间也是,但在齐次坐标系中它们在无穷远点相交。
那为什么要引入齐次坐标系了?
最主要的目的是方便计算机图形学进行仿射几何变换。简单的理解就是可以使用矩阵同时描述旋转和平移,这样我们就可以使用矩阵相乘来表述物体的旋转、缩放和平移了,具体内容可参照《计算机图形学》等书籍或者网上的资料。
如:https://oncemore.wang/blog/homogeneous/
引申的理解
1.笛卡尔坐标系坐标系原点的理解
在笛卡尔坐标系中有一个原点(0,0)有一个新奇的说法,想象在宇宙中有一个绝对坐标系,对于我们现在使用的笛卡尔坐标系,其原点位于(a,b)点,当然同时也就还有无数的相同的坐标系,只不过它们的原点不同,对于笛卡尔坐标系中的点(x,y),它对于所有的笛卡尔坐标系都是相同的,有点多维宇宙的感觉,其中一个坐标系就是一个宇宙。
2.向量和点的理解
博客参考:https://blog.csdn.net/winbobob/article/details/38829001
描述一个点比描述一个向量需要更多的信息。我们平时的描述一个点时,其实都忽略了一个信息,即参照点的信息,我们都是基于参照点描述一个点的位置,这个参照点就是原点。
对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得
v = v1 a + v2 b + v3 c (1)
而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得
p – o = p1 a + p2 b + p3 c (2),
从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:
p = o + p1 a + p2 b + p3 c (3)
(1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点!我们现在把(1)(3)写成矩阵的形式:
v = (v1 v2 v3 0) X (a b c o)
p = (p1 p2 p3 1) X (a b c o),
这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第4个代数分量是0,而3D点的第4个代数分量是1。像这种这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。
通过添加额外的一维数据,我们可以分辨点和向量,同时结合矩阵,计算机图形中的仿射变换的需求就可以通过矩阵乘法来解决,非常完美!
感悟
对于齐次坐标系,我一直想知道它的几何意义,但由于使用欧氏几何的三维空间来理解,总是行不通。困在这里很长时间,现在觉得可能这个问题就没有意义。
齐次坐标系作为我们理解这个世界的工具,如果要去追究一个为什么要这么设计,这有点超纲了,也没有意义。就像我们要问一个锤子为什么要那样设计?可能我们最后能得到的回答就是这么设计好用,符合人类使用习惯。而齐次坐标系也是这样,使用齐次坐标系后,矩阵的乘法就能同时处理平移、旋转、缩放,简化了相关的图形计算操作,当人们发现这一点后,自然而然就这样沿用下来。