编辑: 马海东
在计算机图形学里面会经常碰到几何体的平移,旋转,缩放以及投影变换. 一般情况下会涉及到齐次坐标与变换矩阵. 为了后续对变换矩阵内容的讲解, 在这里先简要的介绍一下什么是齐次坐标.
以下为正文内容转载(经过编辑与修改)
by Song Ho Ahn (안성호)
问题:两条平行线可以相交?
在欧氏空间(几何学)中,同一平面上的两条平行线不能相交,或者说不能永远相交。这是一个大家都熟悉的常识。
但是,在投影空间中就不一样了,比如,下图上的火车铁路在远离眼睛的时候会变得更窄。最后,两条平行的铁轨在地平线处相交,也就是无限远处的一点。
![aed25974c4e1e4e5ba7987311dc9118f.png](https://i-blog.csdnimg.cn/blog_migrate/d5fbb477e8cab58690b1d5eb5e1246ac.jpeg)
铁路变窄,在地平线处相交。
欧氏空间(或笛卡尔空间)能很好地描述我们的2D/3D几何,但它们不足以处理投影空间(实际上,欧氏几何是投影几何的一个子集)。一个2D点的笛卡尔坐标可以表示为(x,y)。
如果这个点远去到无穷远呢?无穷远处的点在欧氏空间中无法具体展示。在投影空间中,平行线会在无穷远处相遇,但在欧氏空间中却做不到。
那么数学家如何用数学的方法来描述这个问题呢?
解决方案: 齐次坐标
由 August Ferdinand Möbius(不错,就是那个莫比乌斯圈的那位) 提出的齐次坐标,使图形和几何学的计算在投影空间中成为可能。齐次坐标是用N+1个数来表示N维坐标的一种方式。
要制作二维齐次坐标,我们只需在现有坐标中增加一个额外的变量w。因此,笛卡尔坐标中的一点,(X,Y)在齐次坐标中就变成了(x,y,w)。而笛卡儿坐标中的X和Y在齐次坐标中的x、y和w则重新表达为
X = x/w
Y = y/w
为什么叫 “齐次”呢?
如前所述,为了将齐次坐标(x,y,w)转换为笛卡尔坐标,我们只需将x和y除以w即可。
![b5e0bd39e602192c19c72ac95b63c60a.png](https://i-blog.csdnimg.cn/blog_migrate/5ab253e4ba303f8584f7f7b637b6a4d9.jpeg)
将Homogeneous转换为Cartesian,我们可以发现一个重要的事实。让我们看看下面的例子。
![6b4c436d1b9e324cea0d894a8a5ab80b.png](https://i-blog.csdnimg.cn/blog_migrate/92f841b3a1d06576b00e8a049ff4ec2f.jpeg)
如你所见 (1, 2, 3), (2, 4, 6)和(4, 8, 12)这三个点对应于同一个欧氏点(1/3, 2/3). 而任何乘以a的数(1a,2a,3a)与欧氏空间中的(1/3,2/3)是同一个点。因此,这些点是 “homogeneous/齐次 “的,因为它们在欧氏空间(或笛卡尔空间)中代表同一个点。换句话说,齐次坐标是与乘数a不相关的。
![3148a27affb20112207a463f51350ae8.png](https://i-blog.csdnimg.cn/blog_migrate/1e292d3525b5d71ab7649f158ddb86d8.jpeg)
数学证明: 两条平行线可以相交
考虑以下欧氏空间的线性系统。
![5efd4cad03d8c5e1ffe3d31a531bf302.png](https://i-blog.csdnimg.cn/blog_migrate/964c75bcab60d74e01ffa3d4fd8881a0.jpeg)
而我们知道,由于C≠D,所以上述方程没有解。 如果C=D,那么两条线是相同的(重叠的)。
让我们重写投影空间的方程,将x和y分别替换为x/w,y/w。
![4a8d4bd17223faea1f7edf7d1f56f1d5.png](https://i-blog.csdnimg.cn/blog_migrate/6671f65e2bf9ef4792f7816e467992e9.jpeg)
现在,我们有一个解,(x,y,0),因为(C-D)w=0,∴w=0. 因此,两条平行线在(x,y,0)处相交.
(x,y,0)在几何上代表一条没有起点与终点, 也没有长度的射线,它只有方向。
齐次坐标的应用
齐次坐标在计算机图形学中是非常有用的基本概念,通过增加一个额外的维度W后,可以用来对几何体进行缩放,旋转,平移,透视投影的矩阵变换.
任何N维度齐次坐标,只要W不为0,都可以通过将每一个分量除以W来转换到 W=1的向量, 然后获得其N-1维的欧式空间的点值。
而当W=0时,这个坐标表示无限长的一个向量,通常表示N-1维的矢量。
reference
http://www.songho.ca/math/homogeneous/homogeneous.html
https://hackernoon.com/programmers-guide-to-homogeneous-coordinates-73cbfd2bcc65
https://www.tomdalling.com/blog/modern-opengl/explaining-homogenous-coordinates-and-projective-geometry/
相关文章
关于建筑师为什么要会python编程?
技术贴 | Caad4Rhino:建筑绘图工具插件
Rhino及Bob McNeel的故事(转载)
spline: 计算机曲线简史(转载)
漫谈算法设计与脚本语言(grasshopper, python)
算法:平面图自动生成(转载)
建筑师编程
ikuku精选 Python4Rhino建筑师编程课 第5期 2020.9.26 开始线上直播!讲师:马海东
![59e31fa67afb0f3c8abe4674f91dd370.png](https://i-blog.csdnimg.cn/blog_migrate/e937871984c44c457bbbcc17551d5c83.jpeg)