现在的位置: 首页 > 综合 > 正文

孙鑫VC学习笔记:第十一讲 (一) 坐标空间与各种转换的概念

2013年05月24日 ⁄ 综合 ⁄ 共 2902字 ⁄ 字号 评论关闭

孙鑫VC学习笔记:第十一讲 坐标空间与各种转换的概念

介绍一下坐标空间、逻辑空间、映射方式等概念

MicroSoft Windows 下的程序运用坐标空间和转换来对图形输出进行缩放,平移,旋转,斜切和反射。
一个坐标空间是一个二维空间,通过使用连个相互垂直并且长度相等的轴来定义二维对象

 

坐标空间
API使用四种坐标空间:世界坐标系空间,页面空间,设备空间,和物理设备空间。基于Win32的应用程序运用世界坐标系空间对图形输出进行旋转、斜切或者反射。

Win32 API把世界坐标系空间和页面空间称为逻辑空间;最后一种坐标空间(即物理设备空间)通常指应用程序窗口的客户区;但是他也包括整个桌面、完整的窗口(包括框架、标题栏和菜单栏)或打印机的一页或绘图仪的一页纸。物理设备的尺寸随显示器、打印机、绘图仪的所设置的尺寸而改变。

转换
如果要在一个物理设备上绘制输出,Windows把一个矩形区域从一个坐标空间拷贝到(或映射到)另一个坐标空间,直至最终完整的输出呈现在物理设备上(通常是屏幕或打印机)

如果该应用程序调用了SetWorldTransForm函数,那么映射就从应用程序的世界坐标系空间开始;否则,映射在页面空间中进行。在Windows把矩形区域的每一点从一个空间拷贝到另一个空间时,他采用一种被称作转换的算法,转换是把对象从一个坐标空间拷贝到另一个坐标空间时改变(或转变)这一对象的大小,方位,和形态,尽管转换把对象看成一个整体,但他也作用与对象的每一个点或每一条线。

---------------------------------------------------------------------------------
页面空间到设备空间的转换
页面空见到设备空间的转换是原Windows程序接口的一部分。这种转换确定与一特定设备描述表相关的所有图形输出的映射方式。
所谓映射方式是指确定用于绘图操作的单位大小的一种量度转换,映射方式是一种影响几乎任何客户区绘图的设备环境属性。另外还有四种设备环境属性:窗口原点,视口原点,窗口范围和视口范围,这四种属性与映射关系密切相关。

页面空间到设备空间的转换所用的是两个矩形的宽与高的比率,其中页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口。Windows把窗口原点映射到视口原点,把窗口范围映射到视口范围,就完成了这种转换。

---------------------------------------------------------------------------------
设备空间到物理空间的转换
设备空间到物理空间的转换:只限于平移,并由Windows窗口管理部分控制,这种转换的唯一用途是确保设备空间的原点被映射到物理设备上的适当点上。没有函数能设置这种转换,也没有函数能获取有关数据。
所以通常我们所要考虑的是从页面空间到设备空间的转换。页面空间通常称为逻辑空间。

---------------------------------------------------------------------------------
默认转换
一旦应用程序建立了设备描述表,并立即开始调用GDI绘图或输出函数,则运用默认页面空间到设备空间的转换和设备空间到客户区的转换,(在应用程序调用SetWorldTransform之前不会世界坐标空间到页面空间的转换。

默认页面空间到设备空间的转换是一对一的映射;即页面空间上给出的一点映射到设备空间上的一个点。这种转换没有以矩阵指定,而是通过把视口宽除以窗口宽,把视口高除以窗口高而得出的,在默认情况下,视口尺寸为1*1像素,窗口尺寸为1*1页单位。

设备空间到物理设备(客户区,桌面和打印机),得转换结果总是一对一的;既设备空间上的一个单位总是与客户区,桌面,和打印机上的一个单位对应。这一转换的唯一用途是平移,无论窗口移到桌面的什么位置,它永远取保输出能够正确无误地出现在窗口上。

默认装换的一个独特之处是设备空间与应用程序窗口的y轴方向。
在默认的状态下,y轴正向朝下,-y方向朝上。

---------------------------------------------------------------------------------
逻辑坐标和设备坐标
几乎在所有GDI函数中使用的坐标值都是逻辑单位,Windows必须将逻辑坐标值转换为“设备单位”,
即像素。这种转换是由映射方式,窗口和视口的原点以及窗口和视口的范围决定的。
Windows对所有消息(如WM_SIZE,WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP),所有的非GDI函数和一些GDI函数(GetDeviceCaps函数),永远使用设备坐标。

窗口是基于逻辑坐标的,逻辑坐标可以是像素,毫米,英寸等单位,使口是基于设备坐标(像素)的。通常,视口和客户区是相同的。
缺省的映射模式是MM_TEXT,在这种映射模式下,逻辑单位和设备单位相同。

---------------------------------------------------------------------------------
窗口(逻辑)坐标和视口(设备)坐标的转换
 xViewPort=(xWindow-xWinOrg)*xViewExt/xWinExt+xViewOrg;
 yViewPort=(yWindow-yWinOrg)*yViewExt/yWinExt+yViewOrg;
视口(设备)坐标和窗口(逻辑)坐标的转换与上面相反;
---------------------------------------------------------------------------------
在MM_TEXT映射方式下窗口(逻辑)坐标和视口(设备)坐标的转换:
xViewPort=xWindow-xWinOrg+xViewOrg;
yViewPort=yWindow-yWinOrg+yViewOrg;
视口(设备)坐标和窗口(逻辑)坐标的转换与上面相反;
---------------------------------------------------------------------------------
CDC中提供两个成员函数SetViewpoitOrg和SetWindowOrg,用来改变视口和窗口的原点。
如果将视口原点设为(xViewOrg,yViewOrg),则逻辑点(0,0)就会被映射为设备点(xViewOrg,yViewOrg),如果将窗口原点改变为(xWinOrg,yWinOrg),则逻辑点(xWinOrg,yWinOrg)就会被映射为设备点(0,0),
 即左上角。
不管对窗口和视口原点作什么改变,设备点(0,0)始终是客户区的左上角。

---------------------------------------------------------------------------------

 

【上篇】
【下篇】

抱歉!评论已关闭.