利用矩阵进行坐标转换

上传人:wt****50 文档编号:37829554 上传时间:2018-04-23 格式:DOC 页数:9 大小:89KB
返回 下载 相关 举报
利用矩阵进行坐标转换_第1页
第1页 / 共9页
利用矩阵进行坐标转换_第2页
第2页 / 共9页
利用矩阵进行坐标转换_第3页
第3页 / 共9页
利用矩阵进行坐标转换_第4页
第4页 / 共9页
利用矩阵进行坐标转换_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《利用矩阵进行坐标转换》由会员分享,可在线阅读,更多相关《利用矩阵进行坐标转换(9页珍藏版)》请在金锄头文库上搜索。

1、利用矩阵进行坐标转换之前做拓扑图,本来打算整一套坐标系统在里面的,后来因为之前做拓扑图,本来打算整一套坐标系统在里面的,后来因为时间原因暂时用了最原始的方法实现。现在稍稍得闲,重新开始思时间原因暂时用了最原始的方法实现。现在稍稍得闲,重新开始思考这个问题。不过在搜索的时候,意外发现考这个问题。不过在搜索的时候,意外发现.Net Framework 类库类库中自带的有实现坐标系转换功能的类。中自带的有实现坐标系转换功能的类。Reflector 了一把,发现代码了一把,发现代码看不懂了看不懂了都是利用矩阵操作的。矩阵这玩意儿,几年没用早忘都是利用矩阵操作的。矩阵这玩意儿,几年没用早忘完了。于是认真

2、学习了一把,顺便把如何用矩阵进行坐标转换的过完了。于是认真学习了一把,顺便把如何用矩阵进行坐标转换的过程记录和注解一下。文中部分内容摘取自程记录和注解一下。文中部分内容摘取自 MSDN,搜索,搜索“变换的矩变换的矩阵表示形式阵表示形式”即可找到。即可找到。首先首先 review 一下矩阵的基础知识:一下矩阵的基础知识:mn 矩阵是排列在矩阵是排列在 m 行和行和 n 列中的一系列数。下图显示几列中的一系列数。下图显示几个矩阵。个矩阵。可以通过将单个元素相加来加合两个尺寸相同的矩阵。下图显可以通过将单个元素相加来加合两个尺寸相同的矩阵。下图显示了两个矩阵相加的示例。示了两个矩阵相加的示例。mn

3、矩阵可与一个矩阵可与一个 np 矩阵相乘,结果为一个矩阵相乘,结果为一个 mp 矩阵。矩阵。第一个矩阵的列数必须与第二个矩阵的行数相同。例如,一个第一个矩阵的列数必须与第二个矩阵的行数相同。例如,一个 42 矩阵与一个矩阵与一个 23 矩阵相乘,产生一个矩阵相乘,产生一个 43 矩阵。矩阵。矩阵的行列的平面点可视为矢量。例如,矩阵的行列的平面点可视为矢量。例如,(2, 5) 是具有两个组件是具有两个组件的矢量,的矢量,(3, 7, 1) 是具有三个组件的矢量。两个矢量的点积定义如是具有三个组件的矢量。两个矢量的点积定义如下:下:(a, b) ? (c, d) = ac + bd(a, b, c

4、) ? (d, e, f) = ad + be + cf例如,例如,(2, 3) 和和 (5, 4) 的点积是的点积是 (2)(5) + (3)(4) = 22。(2, 5, 1) 和和 (4, 3, 1) 的点积是的点积是 (2)(4) + (5)(3) + (1)(1) = 24。请注意,两个。请注意,两个矢量的点积是数字,而不是另一个矢量。另外请注意,只有当两个矢量的点积是数字,而不是另一个矢量。另外请注意,只有当两个矢量的组件数相同时,才能计算点积。矢量的组件数相同时,才能计算点积。将将 A(i, j) 作为矩阵作为矩阵 A 中第中第 i 行、第行、第 j 列的项。例如,列的项。例如,

5、A(3, 2)是矩阵)是矩阵 A 中第中第 3 行、第行、第 2 列的项。假定列的项。假定 A、B 和和 C 是矩阵,是矩阵,且且 AB = C,则,则 C 的项计算如下:的项计算如下:C(i, j) =(A 的第的第 i 行)行)?(B 的第的第 j 列)列)下图显示了矩阵相乘的几个示例。下图显示了矩阵相乘的几个示例。以第二个等式为例,假设等式两边的矩阵分别是以第二个等式为例,假设等式两边的矩阵分别是 a、b、c,1*3的矩阵和的矩阵和 3*2 的矩阵相乘,得到的结果为的矩阵相乘,得到的结果为 1*2 的矩阵。其中的矩阵。其中 c00 = a00*b00+a01*b10+a02*b20,c0

6、1=a00*b01+a01*b11+a02*b21。矩阵的加法、乘法,可以用来做坐标转换。我们通常使用矩阵的加法、乘法,可以用来做坐标转换。我们通常使用3*3(如果不需要旋转,则如果不需要旋转,则 2*2 的矩阵即可的矩阵即可)的矩阵来做平面上的各种的矩阵来做平面上的各种坐标转换,包括坐标转换,包括 x/y 轴的平移、旋转。现在来看一个简单的坐标系轴的平移、旋转。现在来看一个简单的坐标系转换的例子:假设我们的客户区分辨率是转换的例子:假设我们的客户区分辨率是 100*100,要在客户区中,要在客户区中心点画一个点,这个点的坐标是心点画一个点,这个点的坐标是(x, y)。现在如果我们调整了客户区

7、。现在如果我们调整了客户区分辨率为分辨率为 400*300,此时如果还需要保持这个点的相对位置不变,此时如果还需要保持这个点的相对位置不变,计算他的坐标应该是计算他的坐标应该是(x * 400 / 100, y * 300 / 100)。这个计算过程很。这个计算过程很简单,那么用矩阵操作应该如何来实现呢?简单,那么用矩阵操作应该如何来实现呢?我们将这个点视为一个我们将这个点视为一个 1*2 的矩阵,将其乘以一个的矩阵,将其乘以一个 2*2 的矩阵,的矩阵,得出的仍然是一个得出的仍然是一个 1*2 的矩阵,就是新的坐标了。由于屏幕分辨率的矩阵,就是新的坐标了。由于屏幕分辨率在在 x、y 轴分别扩

8、大为原来的轴分别扩大为原来的 4 倍和倍和 3 倍,那么我们只要将点的倍,那么我们只要将点的x、y 轴坐标都扩大到原来的轴坐标都扩大到原来的 4、3 倍即可。公式如下:倍即可。公式如下:等式左边的第二个矩阵,就是用来实现坐标转换的矩阵。其中等式左边的第二个矩阵,就是用来实现坐标转换的矩阵。其中b00就是就是 x 轴的扩大倍数,轴的扩大倍数,b11就是在就是在 y 轴上的扩大倍数。这轴上的扩大倍数。这里面里面 b01和和 b10永远是永远是 0。坐标系的这种转换,叫做线性变换。坐标系的这种转换,叫做线性变换。OK。看完这个例子,是不是觉得用矩阵比直接计算还麻烦?嗯,。看完这个例子,是不是觉得用矩

9、阵比直接计算还麻烦?嗯,对于这种简单的情况是这样的。不过别急,继续看坐标系旋转的情对于这种简单的情况是这样的。不过别急,继续看坐标系旋转的情况,如果现在要求这个客户区逆时针旋转况,如果现在要求这个客户区逆时针旋转 30 度,要保持这个点的相度,要保持这个点的相对位置不变,他的新坐标应该是多少呢?对位置不变,他的新坐标应该是多少呢?普通的计算的公式就不陈述了,这就是个初中几何题目。我们普通的计算的公式就不陈述了,这就是个初中几何题目。我们直接来看怎样通过矩阵操作实现。首先看公式:在二维空间中,旋直接来看怎样通过矩阵操作实现。首先看公式:在二维空间中,旋转可以用一个单一的角转可以用一个单一的角 定

10、义。作为约定,正角表示逆时针旋转。定义。作为约定,正角表示逆时针旋转。关于原点逆时针旋转关于原点逆时针旋转 的矩阵是的矩阵是:也就是说,逆时针旋转也就是说,逆时针旋转 30 度的新坐标就是:度的新坐标就是:当然,除此之外,坐标系还有平移,但是这个就简单了,只是当然,除此之外,坐标系还有平移,但是这个就简单了,只是一个简单的矩阵加法。比如一个简单的矩阵加法。比如(x, y)向右平移一个单位,用矩阵就是向右平移一个单位,用矩阵就是x, y + 1, 0就是是就是是(x + 1, y)。下图显示了应用于点下图显示了应用于点 (2, 1) 的几个变换:的几个变换:前图中显示的所有变换都是线性变换。某些

11、其他变换(如平移)前图中显示的所有变换都是线性变换。某些其他变换(如平移)不是线性的,不能表示为与不是线性的,不能表示为与 22 矩阵相乘的形式。假定您要从点矩阵相乘的形式。假定您要从点 (2, 1) 开始,将其旋转开始,将其旋转 90 度,在度,在 x 方向将其平移方向将其平移 3 个单位,在个单位,在 y 方向将其平移方向将其平移 4 个单位。可通过先使用矩阵乘法再使用矩阵加法个单位。可通过先使用矩阵乘法再使用矩阵加法来完成此操作。来完成此操作。后面跟一平移(与后面跟一平移(与 12 矩阵相加)的线性变换(与矩阵相加)的线性变换(与 22 矩阵矩阵相乘)称为仿射变换,如上图所示。放射变换(

12、先乘后加)可以通相乘)称为仿射变换,如上图所示。放射变换(先乘后加)可以通过乘以一个过乘以一个 3*3 的矩阵来实现,若要使其起作用,平面上的点必须的矩阵来实现,若要使其起作用,平面上的点必须存储于具有虚拟第三坐标的存储于具有虚拟第三坐标的 13 矩阵中。通常的方法是使所有的矩阵中。通常的方法是使所有的第三坐标等于第三坐标等于 1。例如,矩阵。例如,矩阵 2 1 1 代表点代表点 (2, 1)。下图演示了。下图演示了表示为与单个表示为与单个 33 矩阵相乘的仿射变换(旋转矩阵相乘的仿射变换(旋转 90 度;在度;在 x 方向方向上平移上平移 3 个单位,在个单位,在 y 方向上平移方向上平移

13、4 个单位):个单位):在前面的示例中,点在前面的示例中,点 (2, 1) 映射到了点映射到了点 (2, 6)。请注意,。请注意,33 矩阵的第三列包含数字矩阵的第三列包含数字 0,0,1。对于仿射变换的。对于仿射变换的 33 矩阵而言,矩阵而言,情况将总是如此。重要的数字是列情况将总是如此。重要的数字是列 1 和列和列 2 中的中的 6 个数字。矩个数字。矩阵左上角的阵左上角的 22 部分表示变换的线性部分,第部分表示变换的线性部分,第 3 行中的前两项表行中的前两项表示平移。示平移。在使用在使用 3*3 的矩阵做仿射变换时候,表示点的矩阵变成了一个的矩阵做仿射变换时候,表示点的矩阵变成了一

14、个1*3 矩阵,这个矩阵中的最后一个值(矩阵,这个矩阵中的最后一个值(a02)必须设置成)必须设置成 1。对于。对于3*3 矩阵矩阵 b,其最后一列的值是多少是没有关系的,因为他们不会影,其最后一列的值是多少是没有关系的,因为他们不会影响结果中的前两列。不过如上,经常将他们设置为响结果中的前两列。不过如上,经常将他们设置为 0,0,1。这一。这一列对于坐标转换的结果并没有任何影响,但是他们是必须的,因为列对于坐标转换的结果并没有任何影响,但是他们是必须的,因为矩阵相乘必须满足开篇所讲的矩阵相乘必须满足开篇所讲的“相乘的两个矩阵第一个矩阵的列数必相乘的两个矩阵第一个矩阵的列数必须与第二个矩阵的行

15、数相同须与第二个矩阵的行数相同”。在在.Net Framework 中,又一个矩阵类中,又一个矩阵类“Matrix”。其内置了点坐。其内置了点坐标转换(标转换(TransformPoints)、平移()、平移(Translate)、缩放)、缩放(Scale)、旋转()、旋转(Rotate)方法。下面的示例创建了复合变换)方法。下面的示例创建了复合变换(先旋转(先旋转 30 度,再在度,再在 y 方向上缩放方向上缩放 2 倍,然后在倍,然后在 x 方向平移方向平移 5 个单位)的矩阵:个单位)的矩阵:Matrix myMatrix = new Matrix();myMatrix.Rotate(3

16、0);myMatrix.Scale(1, 2, MatrixOrder.Append);myMatrix.Translate(5, 0, MatrixOrder.Append);除了除了 Matrix 类以外,类以外,.Net Framework 中也有其他用于坐标系中也有其他用于坐标系转换的类,比如转换的类,比如 System.Drawing.Graphics。具体用法请查阅相关。具体用法请查阅相关文档。文档。以上只是利用矩阵进行平面坐标系转换的方法。如果是三位坐以上只是利用矩阵进行平面坐标系转换的方法。如果是三位坐标系,也是可以利用矩阵来操作的,但标系,也是可以利用矩阵来操作的,但 Matrix 类不行,因为其本身类不行,因为其本身的定位就是的定位就是“封装表示几何变换的封装表示几何变换的 3 x 3 仿射矩阵仿射矩阵”。不过,可以附

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号