[转]对齐次坐标的理解

摘要:
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”而笛卡尔坐标系和齐次坐标系的根本区别在于“齐次性”。所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。那么齐次坐标是怎么表示点和向量的呢?

齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”——F.S. Hill, JR。

齐次坐标主要是应用在矩阵转换中,我们通常运算的坐标系是“笛卡尔坐标系”,我们已经习惯了笛卡尔坐标系的表述方式,一个点都有唯一对应的数据值来表示,比如原点我们就记做(0,0)点。而笛卡尔坐标系和齐次坐标系的根本区别在于“齐次性”。

所谓齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示。 显然一个向量的齐次表示是不唯一的,齐次坐标的h取不同的值都表示的是同一个点,比如齐次坐标[10,4,2]、[5,2,1]表示的都是二维点[5,2]。

那么引进齐次坐标有什么必要,它有什么优点呢?

由于[10,4,2]、[5,2,1]表示的都是[5,2]一个点,如果有一个公式需要将[5,2]点参与的运算3维运算,而我们的点只有2维的表示,那么我们在值不变的情况下增加一个齐次坐标,使之变成3维,而能够参加运算并不影响最终结果,这就是齐次坐标的价值。

许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为p' = p *m1+ m2(m1旋转缩放矩阵, m2为平移矩阵, p为原向量 ,p'为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为p' = p*M的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。

那么齐次坐标是怎么表示点和向量的呢?

那要从齐次坐标的线性代数性质来看:

一维齐次点坐标:

[转]对齐次坐标的理解第1张

通过上面的定义可以看出,一维的点坐标x的值是齐次坐标中(x1,x2)的关系有 x = x1/x2; 如果x2=1,那么既可以表示为(x,1).其中最特别的点是(0,1)

如果有齐次坐标(x1,x2),由于x2=0的时候表达式分母为零,除法表达式失去意义,因此(x1,0)表示的是一个无穷远点。即忽略其长度属性,那么它就表示一个方向,其中最特别的是(1,0)。

对于二维齐次点坐标:

[转]对齐次坐标的理解第2张

上图表达的意义就是一个点(x,y)他的齐次坐标就是(w*x,w*y,w)其中w不为0

下表列举了一些点的其次表示方式:

[转]对齐次坐标的理解第3张

任意方向的无穷远点是(x1,x2,0)其中方向为x2/x1。y轴上的无穷远点的表示方式是(0,x2,0)。

再用向量的办法来看看 齐次坐标表示“向量“和“点”的区别:

对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c(1)

现在有一个点P,根据向量的性质,v=p-o (o是原点,v表示从坐标原心指向点p的向量) ,那么代入上式即可得到po= p1a +p2b+ p3c (2)

那么点p的表达式就是 p =o+ p1a +p2b+ p3c (3) 那么就会发现,点p的表达式就要比向量v多一个信息。但是o也可以用三维向量来表述,所以

P(1,2,3)和V(1,2,3)从值上而言是完全没有区别的,所以点的就可以用(1,2,3,1)来表示,而向量是(1,2,3,0)。齐次坐标的w为0表示无穷远点,那就只能代表一个方向了。

免责声明:文章转载自《[转]对齐次坐标的理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇15分钟让你了解如何实现并发中的Barrierpython基础学习-字符编码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

opencv3学习:reshape函数

在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数。 函数原型: C++: Mat Mat::reshape(int cn, int rows=0) const 参数比较少,但设置的时候却要千万小心。 cn: 表示通道数(channels), 如果设为0,则表示保持通道数不变,否则则变为...

C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array.Rank;//获取维数,这里指行数int col = array.GetLength(1);//获取指定维度中的元素个数,这里也就是列数了。(0是第一维,1表...

OpenCV 图像采样 插值 几何变换

InitLineIterator 初始化线段迭代器 int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2, CvLineIterator* line_iterator, int connectivity=8 ); image 带采线段的输入图像. pt1 线段起始点 pt...

算法+OpenCV】基于opencv的直线和曲线拟合与绘制(最小二乘法)

http://blog.csdn.net/guduruyu/article/details/72866144 最小二乘法多项式曲线拟合,是常见的曲线拟合方法,有着广泛的应用,这里在借鉴最小二乘多项式曲线拟合原理与实现的原理的基础上,介绍如何在OpenCV来实现基于最小二乘的多项式曲线拟合。   概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这...

VTK 空间几何变换(Transform),平移、旋转和缩放

先看下面的模型,这是一个Cow的三维模型, 在使用中,你是否会有下面的操作? 1.将Cow移动到某个位置——平移 2.转动到Cow背面——旋转 3.改变它大小——缩放 等等 可能你会说,这还不简单,通过操作相机就好了。然而并不是这样,操作相机,只使得相机的空间位置发生了变化,对三维物体并没有改变,要想改变模型,就需要对模形本身做空间变换。 空间变换的基础...

matlab中元胞数组(cell)转换为矩阵

matlab中元胞数组(cell)转换为矩阵、 cell转换为矩阵函数为:cell2mat(c),其中c为待转换的元胞数组; 转化之后的矩阵可能不满足我们对矩阵维数的要求,那么也许还需要下面两个函数: ——reshape(A,m,n,p,...),将矩阵A变换为m*n*p*...的矩阵; ——permute(A,[1,3,2]),将矩阵A的第3维和第2维...