在平面上表示图形,或者说图形的边界,我们使用的是点。那么如果我们想要对一个图形进行变换,实际上我们就可以对点进行变换。在空间中同样如此。
我们知道,平面中的一个点可以用一组由两个数组成的坐标来表示,而三维空间中的坐标则是用三个分别代表x,y,z的数构成的一个坐标来表示。我们可以简单的用一个列向量来表达一个点的坐标,区别只在于列向量的行数的多少。
同时我们可以从上述的第一段中得到这样一个结论,事实上我们只需要对点进行变换就能够对图形进行变换,那么在点由向量表示的情况下,我们只需要对向量进行变换就能够达到相同的效果。
综上,我们将如何进行图像的变换转化成了如何进行某些用向量表示的点的变换,而我们也可以知道,在数学上,对一些点进行变换和对一个点进行变换没有本质上的区别。
那么我们接下来对单个点在向量表示的情况下如何变换进行讨论。
我们先以二维的点为例进行讨论。
首先是图片的缩放。
如图是虎书关于缩放的讲解。
这是一个简单的矩阵和向量相乘的问题。我们以一个二维平面上的单位正方形的四个点的坐标为例,就能很快的明白这个问题。
关于旋转:
同样的我们可以以一个(0,0),(1,0),(0,1),(1,1)的正方形为例来探讨这个问题。
绕(0,0)旋转,记原(0,0)和(0,1)形成的边与x轴正方向形成的夹角为α。
选取(0,1),所对应的向量记为B,和(1,0),所对应的向量记为C,两个点,设正方形旋转α°,由于正方形,且知道边的长度,故我们可以计算得到转换后的坐标,(1,0)对应的坐标为(cosα,sinα),变换后的向量记为B',同理,C旋转后的向量记为C',同时假设一个变换矩阵A,即我们所求的旋转矩阵。
有方程组:AB=B',AC=C'
解得所求的旋转方程,即下图所示的方程。
关于平移:
平移实际上就是在原来的点的坐标上直接加上平移的距离(含正负)。
当我们使用2*2的举证来表示平移的时候,我们所使用的位置是第一行第二列(填入a)和第二行第一列(填如b),但是此时出现了一个问题:如果我们直接将平移的距离填上,会导致此时x变为x+ay,y变为y+bx,与我们所求不一致,我们所需要的是x加上某一个常数和y加上某一个常数,一个更加通用的形式,如果我们想要达到这个效果的话我们就需要在后面再加上一个向量。
那么最后的结果为x+ay+xt,y+bx+yt。
为了解决这个问题,提出了一种新的表示方式,齐次坐标。
当我们给本来是两行的列向量在最后加上一个数后,同时原来的变换矩阵在最后加上一行(0,0,1)后,相乘的结果变得符合我们的要求。
得到用齐次式表示的变换矩阵。
在这样的表示方法中我们可以看到,当我们将xt,yt写在第三列的前两个值的时候,最后的结果是我们想要的那么最后的结果为x+xt,y+yt。(这里的xt和yt是直接平移应该加上的值)
对于其他的变换矩阵,我们用同样的方法处理。
这个时候我们面临一个问题:我们如何处理向量?
我们所使用的是自由向量,它的组成只有长度和方向,和它所在的位置无关。那么与平移的变换矩阵相乘后,向量应当是不变的。
这个问题,只需要将向量的最后一个数置0即可解决。
同样的,点在平移之后应该发生改变,那么则需要将最后一个数置1。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对于三维的情况:
旋转:
对于复杂的旋转,我们可以将它分解为三个旋转的叠加:绕x轴,绕y轴,绕z轴
使用和二维的时候相似的推导方法,我们可以得到下面这样的结论:
那么复杂的旋转实际上只需要将以上三个矩阵连续的与旋转的对象的列向量相乘即可。
对于平移:只需要将单位阵的最后一列的前三个数字替换成对应的x,y,z即可。