[学习笔记] Windows编程——GDI——(五)坐标空间和变换

前言:

学习笔记,随时更新。如有谬误,欢迎指正。


说明:

  1. 红色字体为较为重要部分。
  2. 绿色字体为个人理解部分。

原文链接:https://learn.microsoft.com/en-us/windows/win32/gdi/coordinate-spaces-and-transformations

5 坐标空间和变换

  1. 应用程序使用坐标空间和变换来缩放、旋转、平移、剪切和反射图形输出。坐标空间是一个平面空间,通过使用两个相互垂直的参考轴来定位二维对象。有四个坐标空间:世界、页面、设备和物理设备(客户端区域、桌面或打印纸页)。

  2. 转换是一种改变(“转换”)对象的大小、方向和形状的算法。变换还将图形对象从一个坐标空间转移到另一个坐标空间。最终,对象出现在物理设备上,通常是屏幕或打印机。

5.1 关于坐标空间和变换

5.1.1 坐标空间的转换

  1. 坐标空间是基于笛卡尔坐标系的平面空间。此系统提供了一种指定平面上每个点的位置的方法。它需要两个垂直且长度相等的轴。

  2. 系统支持四个坐标空间,如下表所述:

    坐标空间说明
    世界空间可选地用作图形转换的起始坐标空间。它允许缩放、平移、旋转、剪切和反射。世界空间的高度为 2^32 单位,宽度为 2^32 单位。
    页面空间用作世界空间之后的下一个空间或用作图形转换的起始空间。设置映射模式。页面空间也是 2^32 单位高, 2^32 单位宽。
    设备空间用作页面空间之后的下一个空间。它只允许平移,这确保了设备空间的起源映射到物理设备空间中的正确位置。设备空间的高度为 2^27 单位,宽度为 2^27 单位。
    物理设备空间图形转换的最终(输出)空间。它通常指的是应用程序窗口的客户端区域;但是,它也可以包括整个桌面、一个完整的窗口(包括框架、标题栏和菜单栏),或者一页打印机或绘图纸,这取决于获取设备上下文句柄的函数。物理设备的尺寸根据显示器、打印机或绘图仪技术设置的尺寸而不同。
  3. 为了描述物理设备上的输出,系统使用转换将一个矩形区域从一个坐标空间复制(或映射)到下一个坐标空间,直到输出完整地出现在物理设备上。如果应用程序调用了 SetWorldTransform 函数,则映射从应用程序的世界空间开始;否则,将在页空间中进行映射。

5.1.2 从世界空间到页面空间转换
5.1.2.1 平移
  1. 调用 SetWorldTransform 函数看,并在参数 XFORM 中指定其 eDx 和 eDy 成员来分别指定水平和垂直偏移量。
5.1.2.2 缩放
  1. 调用 SetWorldTransform 函数看,并在参数 XFORM 中指定其 eM11 和 eM22 成员来分别指定水平和垂直缩放量。
5.1.2.3 旋转
  1. 调用 SetWorldTransform 函数看,并在参数 XFORM 中指定其 eM11 、eM12 、 eM21 和 eM22 成员来分别指定旋转角度的余弦、正弦、负正弦和负余弦。
5.1.2.4 剪切
  1. 调用 SetWorldTransform 函数看,并在参数 XFORM 中指定其 eM12 和 eM21 成员来分别指定水平和垂直比例常数。
5.1.2.5 反射
  1. 调用 SetWorldTransform 函数看,并在参数 XFORM 中指定其 eM11 和 eM22 成员来分别指定水平和垂直反射分量(一般为 -1 ,即对坐标分别取反)。
5.1.2.6 组合的世界到页面空间转换
  1. CombineTransform 函数可用于组合两个世界空间到页面空间的转换。可以组合多种变换,最后通过调用 SetWorldTransform 函数来更改与特定设备上下文( DC )相关的输出。
5.1.3 从页面空间到设备空间转换
  1. 页面空间到设备空间的转换决定了与特定 DC 关联的所有图形输出的映射模式。映射模式是一种缩放转换,它指定用于绘制操作的单位的大小。映射模式也可以执行转换。在某些情况下,映射模式会改变 x 轴和 y 轴在设备空间中的方向。
5.1.3.1 映射模式和转换
  1. 下表介绍了映射模式:

    映射模式说明
    MM_ANISOTROPIC页空空间中的每个单元都映射到设备空间中应用程序指定的单元。轴线的比例可能相等,也可能不相等(例如,在世界空间中绘制的圆圈在给定设备上描绘时可能看起来是椭圆)。轴的方向也由应用程序指定。
    MM_HIENGLISH页面空间中的每个单位映射到设备空间中的 0.001 英寸。 x 的值从左到右递增。 y 的值从下往上递增。
    MM_HIMETRIC页面空间中的每个单元映射到设备空间中的 0.01 毫米。 x 的值从左到右递增。 y 的值从下往上递增。
    MM_ISOTROPIC页面空间中的每个单元都映射到设备空间中应用程序定义的单元。坐标轴的比例总是相等的。轴的方向可以由应用程序指定。
    MM_LOENGLISH页面空间中的每个单元映射到设备空间中的 0.01 英寸。 x 的值从左到右递增。 y 的值从下往上递增。
    MM_LOMETRIC页面空间中的每个单元映射到设备空间中的 0.1 毫米。 x 的值从左到右递增。 y 的值从下往上递增。
    MM_TEXT页面空间中的每个单元被映射到一个像素;也就是说,根本不执行任何缩放。当没有转换生效时(这是默认值), MM_TEXT 映射模式中的页面空间相当于物理设备空间。 x 的值从左到右递增。 y 的值从上到下递增。
    MM_TWIPS页面空间中的每个单元都映射到打印机点的二十分之一( 1/1440 英寸)。 x 的值从左到右递增。 y 的值从下往上递增。
  2. 设置映射模式请调用 SetMapMode 函数。查询当前映射模式请调用 GetMapMode

  3. 页面空间到设备空间的转换由由窗口和视口给出的点计算的值组成。在这种情况下,窗口指的是页面空间的逻辑坐标系统,而视口指的是设备空间的设备坐标系统。窗口和视口分别由一个原点、一个水平(“ x ”)范围和一个垂直(“ y ”)范围组成。系统将窗口原点映射到视口原点,将窗口范围映射到视口范围。

  4. 窗口和视口范围决定了页面空间到设备空间转换中使用的比例或缩放因子。对于六种预定义的映射模式( MM_HIENGLISH , MM_LOENGLISH , MM_HIMETRIC , MM_LOMETRIC , MM_TEXT 和 MM_TWIPS ),范围由系统在调用 SetMapMode 时设置,无法自由改变。另外两种映射模式( MM_ISOTROPIC 和 MM_ANISOTROPIC )要求指定范围:先调用 SetMapMode 来设置适当的模式,然后调用 SetWindowExtExSetViewportExtEx 函数来指定范围。在 MM_ISOTROPIC 映射模式中,在调用 SetViewportExtEx 之前调用 SetWindowExtEx 是很重要的。

  5. 窗口和视口的原点决定了在页面空间到设备空间转换中使用的转换。使用 SetWindowOrgExSetViewportOrgEx 函数设置窗口和视口原点。原点与范围无关,应用程序可以设置它们,而不管当前的映射模式如何。更改映射模式不会影响当前设置的原点(尽管它可能会影响范围)。当原点以绝对单位指定,前映射模式不会对它产生影响。要改变原点,使用 OffsetWindowOrgExOffsetViewportOrgEx 函数。

  6. 以下公式显示将点从页面空间转换为设备空间所涉及的数学运算:

    Dx = ((Lx - WOx) * VEx / WEx) + VOx 
    
    其中:
    
    Dx      设备单位的 x 值
    Lx      逻辑单位的 x 值(也称页面空间单位)
    WOx     窗口 x 原点
    VOx     视口 x 原点
    WEx     窗口 x 范围
    VEx     视口 x 范围
    
    

    使用 y 替换 x 的相同公式可转换点的 y 分量。

    这个公式首先使点偏离它的坐标原点。这个值不再受原点的影响,然后通过范围的比例缩放到目标坐标系中。最后,缩放值被目标原点偏移到其最终映射。

  7. LPtoDPDPtoLP 函数可以分别用于逻辑点到设备点和设备点到逻辑点的转换。

5.1.3.2 预定义映射模式
  1. 在六种预定义的映射模式中,一种是设备相关的( MM_TEXT ),其余五种( MM_HIENGLISH 、 MM_LOENGLISH 、 MM_HIMETRIC 、 MM_LOMETRIC 和 MM_TWIPS )是独立于设备的。

  2. 默认的映射模式为 MM_TEXT 。一个逻辑单位等于一个像素。 x 在右边, y 在下面。此模式直接映射到设备的坐标系统。逻辑到物理映射只涉及 x 和 y 上的偏移量,该偏移量由应用程序控制的窗口和视口原点定义。视口和窗口范围都设置为 1 ,创建一个一对一的映射。

  3. 显示几何形状(圆形、正方形、多边形等)的应用程序使用一种与设备无关的映射模式。

5.1.3.3 应用程序定义的映射模式
  1. 针对特定于应用程序的映射模式,系统提供了两种应用程序定义的映射模式( MM_ISOTROPIC 和 MM_ANISOTROPIC )。 MM_ISOTROPIC 模式保证 x 方向和 y 方向上的逻辑单元是相等的,而 MM_ANISOTROPIC 模式允许逻辑单元不同。
5.1.4 从设备空间到物理设备空间转换
  1. 设备空间到物理设备空间的转换在几个方面是独特的。例如,它仅限于平移,由系统控制。这种转换的唯一目的是确保设备空间的原点映射到物理设备空间上的适当点。没有设置此转换的函数,也没有查询相关数据的函数。
5.1.5 默认转换
  1. 每当应用程序创建 DC 并立即开始调用 GDI 绘制或输出函数时,它都会利用默认的页面空间到设备空间的转换,以及设备空间到客户端区域的转换。世界空间到页面空间的转换直到应用程序调用 SetGraphicsMode 函数将模式设置为 GM_ADVANCED 并调用 SetWorldTransform 函数之后才发生。

  2. 使用 MM_TEXT (默认的页面空间到设备空间的转换)会产生一对一的映射;也就是说,页面空间中的给定点映射到设备空间中的同一点。如前所述,这个变换不是由矩阵指定的。相反,它是通过将视口的宽度除以窗口的宽度和视口的高度除以窗口的高度来获得的。在默认情况下,视口尺寸是 1 像素乘 1 像素,窗口尺寸是 1 页乘 1 页。MM_TEXT 的一个独特之处在于 y 轴在页面空间中的方向。在 MM_TEXT 中,正 y 轴向下延伸,负 y 轴向上延伸。

  3. 设备空间到物理设备空间(客户端区域、桌面或打印纸)的转换总是导致一对一的映射;也就是说,设备空间中的一个单元始终等同于客户端区域、桌面或页面中的一个单元。这种转换的唯一目的是平移;它确保输出在应用程序的窗口中正确显示,无论该窗口在桌面上移动到哪里。

5.2 使用坐标空间和变换

  1. 有关详细信息,请参阅使用坐标空间和变换

5.3 坐标空间和变换参考

5.3.1 坐标空间和变换函数

  1. 有关详细信息,请参阅坐标空间和变换函数

5.3.2 坐标空间和变换结构体

  1. 有关详细信息,请参阅坐标空间和变换结构体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值