坐标系和坐标变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
坐标系和坐标变换
.NET Framework 4.5
其他版本
GDI+ 提供了世界变换和页面变换,以便您可以变换(旋转、缩放、平移等)所绘制的项。两种坐标变换还允许您使用多种坐标系。
本节内容
坐标系类型
介绍坐标系和坐标变换。
变换的矩阵表示形式
讨论将矩阵用于坐标变换。
全局变换和局部变换
讨论全局变换和局部变换。
参考
Matrix
封装表示几何变换的 3x3 仿射矩阵。
相关章节
在托管 GDI+ 中使用变换
提供一个主题列表,其中的主题提供有关如何使用矩阵变换的更多信息。
关于 GDI+ 托管代码
包含一个主题列表,这些主题描述 .NET Framework 中可使用的图形构造。
坐标系类型
.NET Framework 4.5
其他版本
GDI+ 使用三个坐标空间:世界、页面和设备。世界坐标是用于建立特殊图形世界模型的坐标系,也是在 .NET Framework 中传递给方法的坐标系。页面坐标系是指绘图图面(如窗体或控件)使用的坐标系。设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系。当调用myGraphics.DrawLine(myPen, 0, 0, 160, 80)时,传递给DrawLine方法的点((0, 0)和(160, 80))位于世界坐标空间内。在 GDI+ 可以在屏幕上绘制线条之前,坐标先要经过一系列变换。一种称为“世界变换”的变换可将世界坐标转换为页面坐标,而另一种称为“页面变换”的变换可将页面坐标转换为设备坐标。
变换和坐标系
假定您想使用原点位于工作区的主体而非左上角的坐标系统。例如,您需要让原点位于距工作区左边缘 100 像素、距顶部 50 像素的位置。下图显示了这样的坐标系统。
当调用myGraphics.DrawLine(myPen, 0, 0, 160, 80)时,可得到下面的插图中所显示的线条。
下表显示了三种坐标空间中线条终点的坐标:
请注意,页面坐标空间的原点在工作区的左上角,情况将总是如此。另外请注意,由于度量单位是像素,所以设备坐标与页面坐标是相同的。如果将度量单位设置为像素以外的其他单位(例如英寸),设备坐标将不同于页面坐标。
用于将世界坐标映射到页面坐标的世界变换保存在Graphics类的Transform属性中。在前面的示例中,世界变换是在 x 方向平移 100 个单位、在 y 方向平移 50 个单位。下面的示例设置了Graphics对象的世界变换,然后使用该Graphics对象绘制前图中显示的线条:
C#
VB
myGraphics.TranslateTransform(100, 50)
myGraphics.DrawLine(myPen, 0, 0, 160, 80)
页面变换将页面坐标映射到设备坐标。Graphics类提供了用于操作页面变换
的PageUnit和PageScale属性。Graphics类还提供了两个只读属性:DpiX和DpiY,用于检查显示设备每英寸的水平点数和垂直点数。
可使用Graphics类的PageUnit属性指定除像素以外的其他度量单位。
下面的示例从 (0, 0) 至 (2, 1) 绘制线条,其中点 (2, 1) 位于点 (0, 0) 的右边 2 英寸和下边 1 英寸处:
C#
VB
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)
Dim myPen As New Pen(Color.Black, 1 / myGraphics.DpiX)
如果我们假定显示设备在水平方向和垂直方向每英寸都有 96 个点,则上例中直线的终结点在三个坐标空间中分别具有以下坐标:
请注意,由于世界坐标空间的原点在工作区的左上角,因此页面坐标与世界坐标相同。
您可以合并世界变换和页面变换,以实现多种效果。例如,假定您想使用英寸作为度量单位,并且想让坐标系统的原点距工作区左边缘 2 英寸、距工作区顶部 1/2 英寸。下面的示例设置Graphics对象的世界变换和页面变换,然后绘制一条从 (0, 0) 到 (2, 1) 的直线:
C#
VB
myGraphics.TranslateTransform(2, 0.5F)
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)
下图显示了线条和坐标系统。
如果我们假定显示设备在水平方向和垂直方向每英寸都有 96 个点,则上例中直线的终结点在三个坐标空间中分别具有以下坐标:
变换的矩阵表示形式
.NET Framework 4.5
其他版本
m×n 矩阵是排列在 m 行和 n 列中的一系列数。下图显示几个矩阵。
您可以通过将单个元素相加来加合两个尺寸相同的矩阵。下图显示了两个矩阵相加的示例。
m×n 矩阵可与一个 n×p 矩阵相乘,结果为一个 m×p 矩阵。第一个矩阵的列数必须与第二个矩阵的行数相同。例如,一个 4×2 矩阵与一个 2×3 矩阵相乘,产生一个 4×3 矩阵。
矩阵的行列的平面点可视为矢量。例如,(2, 5) 是具有两个组件的矢量,(3, 7, 1) 是具有三个组件的矢量。两个矢量的点积定义如下:
(a, b) • (c, d) = ac + bd
(a, b, c) • (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 列的项。例如,A(3, 2)是矩阵 A 中第 3 行、第2 列的项。假定 A、B 和 C 是矩阵,且 AB = C,则 C 的项计算如下:
C(i, j) =(A 的第 i 行)•(B 的第 j 列)
下图显示了矩阵相乘的几个示例。