`
webcenterol
  • 浏览: 917757 次
文章分类
社区版块
存档分类
最新评论

Windows GDI中的坐标系(二)

 
阅读更多

Windows GDI中的坐标系(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

By leezy_2000

2003-10-21 16:13

一、逻辑空间的坐标是如何转化为设备空间的坐标的?

让我们先来澄清逻辑坐标空间内部是如何转化的。

世界坐标空间到页面坐标空间的变换(二维affine(注三)变换):

此过程中涉及到的各种变换,比如:相等、平移、缩放、映像、旋转、剪切、合并等都是通过为affine矩阵的各个成员指定适当的值来实现的。

这个矩阵所对应的结构如下:

 typedef struct _XFORM { 

 FLOAT eM11; 

 FLOAT eM12; 

 FLOAT eM21; 

 FLOAT eM22; 

 FLOAT eDx; 

 FLOAT eDy; 

 } XFORM, *PXFORM; 

一个世界坐标空间的点转换为页面坐标空间的点的公式为:

xpage=xworld*eM11+yworld*eM21+eDx;

ypage=xworld*eM12+yworld*eM22+eDy;(公式一)

其中xworld、yworld为世界坐标空间的点。xpage、ypage为上述点在页面坐标空间中对应的位置。至于与affine变换的数学属性及如何才能实现页面的相等、平移、缩放、映像、旋转、剪切、合并此处不进行详细说明,因为那样将使这篇文章的规模膨胀许多(注四)。

页面坐标空间到设备坐标空间的转换:

这个过程涉及到几个概念,他们分别是:

视口原点:当前页面坐标空间所认为的设备坐标空间的原点位置。用SetViewportOrgEx、GetViewportOrgEx分别进行设置和读取。用这两个函数进行操作时,所涉及的坐标为设备空间的坐标。

视口范围: 视口范围并不是一个绝对的用于表示设备坐标空间大小的值。而是一个相对值,它同窗口范围的比例最终决定页面坐标空间到设备坐标空间是一种缩小还是放大的转换。用SetViewportExtExGetViewportExtEx对视口范围进行存取。

窗口原点:页面坐标空间的原点。用SetWindowOrgEx、GetWindowOrgEx对窗口原点进行存取,所涉及的坐标为逻辑坐标。

窗口范围:见视口范围的说明。用SetWindowExtExGetWindowExtEx进行存取。

由了两个坐标空间的原点值和范围的比例值,在这两个坐标空间间进行坐标转换也就不是什么太难的事了。比较容易的可以得出下面的公式:

页面坐标空间到设备坐标空间:

xdevice=(xpage-WOrgx)*VExtx /WExtx+VOrgx;

ydevice=(ypage-WOrgy)*VExty /WExty+VOrgy;(公式二)

其中(WOrgx,WOrgy)为窗口原点。(VOrgx VOrgy,)为视口原点。(WExtx, WExty)为窗口范围。(VExtx,VExty)为视口范围。

设备坐标空间到页面坐标空间的转换大家可以自己推导。

为了更好的理解坐标空间的转换,我们将利用上述两组公式,动手来实现自己的LPtoDP。我们的这个函数将只适合nt类的平台。(9x没有世界坐标空间,会更简单)具体实现见源码2。实现MyLPtoDP的过程比较简单,此处仅对要用到的几个主要函数做些说明。

int GetGraphicsMode(

 HDC hdc // handle to device context

);

这个函数用来得到指定DC的图形模式。图形模式有两种GM_COMPATIBLE和GM_ADVANCED

只有在GM_ADVANCED才可能使用世界坐标空间。可以用SetGraphicsMode在两者间切换。

BOOL GetWorldTransform(

 HDC hdc, // handle to device context

 LPXFORM lpXform // transformation

);

此函数用来得到与当前DC相关联的affine矩阵。通过公式一,
应该可以知道缺省的affine矩阵具有{1.0,0,0,1.0,0,0}的形式。

MyLPtoDP虽然有返回值但此值无意义,并且实现过程中也并没有进行任何出错处理。

见源码2。

二、关于GDI+的补充说明

就各种坐标空间而言GDI+的更新更多的体现在操作方式上而非在本质上。理解了上述概念再看GDI+的坐标空间,会有一种一目了然感觉。而本文更侧重于概念的树立,因此就不单独再对GDI+进行特别说明了。

注一:这里仅是一种可能的情形,具体的转换后数值要由当前的坐标空间来具体确定。

注二:我个人认为GDI的坐标空间其实就是坐标系,但由于对应英文术语为Coordinate Space,并且大多书籍译为坐标空间,所以此处亦如是。

注三:大家都知道通过乘上一个2x2的矩阵可以完成诸如缩放、旋转、镜像等操作。

如下图:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 322.5pt; HEIGHT: 267.75pt" type="#_x0000_t75"><img o:title="change" src="/Develop/ArticleImages/21/21922/CSDN_Dev_Image_2003-11-31633140.gif"></shape>

如上这几种变换被称作linear transformations。但通过乘上2x2的矩阵你无法完成平移一类的操作。为达到平移的目的就还需要加上一组偏移量(分别对应于x轴和y轴)。一个2x2矩阵和一组偏移量就构成了Affine矩阵。

注四:请参考Feng Yuan的《windows 图形编程》

分享到:
评论

相关推荐

    Windows图形编程中的坐标系与GDI映射方式

    本文从GDI 映射方式入手, 对基于设备坐标的视口和基于逻辑坐标的窗口的概念、内涵及其相互关系进行了分析...在此基础上, 文章详述了怎样建立不同原点、单位和正方向的逻辑坐标系, 对坐标系的构建原理进行了深入剖析。

    基于VC++的GDI常用坐标系统及应用

    在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统。Windows提供了几种映射方式,每一种映射都对应着一种坐标系。

    GDI+程序设计

    全书共分为4个部分:第1部分是对GDI+的用途和结构的概述,第2部 分结合代码实例讲述了GDI+编程的具体细节,如绘图表面、坐标系、钢笔和笔刷、文本和字体、图像和图像操作、路径和区域、变换的处理和打印等。...

    viewport 视口与窗口 逻辑坐标 设备坐标

    逻辑坐标与设备坐标 viewport 视口 窗口 GDI 坐标 映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射...Windows有关映射模式的一些术语:逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标系称为"视口"。

    GDI+程序设计(GDI+ Programming: Creating Custom Controls Using C#)

    介绍GID+的作用和结构 解释和演示绘图表面、坐标系和度量单位 设计和创建Windows Forms自定义控件 Eric White 著 杨浩 张哲峰 译

    GDI+_SDK参考.pdf

    GDI+是包含于Windows XP和Windows Server 2003中的一项新技术。运行于Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和 Windows Me操作系统的应用程序在分发的时候需要包含GDI+。 适用读者 GDI+ C++ 基类...

    Windows 程序设计(第5版)(上、下册)--详细书签版

    5.5.2 设备坐标系 5.5.3 机口和窗口 5.5.4 处理mm_text 5.5. 5 “度量”映射方式 5.5.6 “自作主张的”映射方式 5.5.7 whatsize 程序 5.6 短形、区域和剪裁 5.6.1 矩形函数 5.6.2 随机短形 ...

    大漠中文模块 多线程 带例子

    文字方面 1. 所有文字识别接口都支持后台gdi 后台gdi2 后台dx 后台dx2 后台dx3 以及前台normal 2. 支持RGB HSV颜色识别 3. 支持RGB HSV差色识别 4. 支持多种颜色混合识别...2. 第二个是根据系统中的字体,来制作字库

    Win32 SDK制作坦克大战Demo

    纯粹SDK开发的...图形显示用的是GDI,用了双缓冲... ...最明显的就是坐标系的问题..未来两周没时间来继续做了...如果可能7月1号前后我会来进行完善...不过我实在不想写地图文件...读写文件好做...写地图很烦人啊...

    C#涂鸦游戏软件

    摘要:C#源码,游戏开发,涂鸦游戏 益智涂鸦游戏软件,一款基于C#编写开发的涂鸦游戏软件+源代码,... 这是因为GDI绘图的坐标系不只一个,好像有三个,没有仔细了解,一个是屏幕坐标,一个是客户区坐标,还个是文档坐标

    com组件,含多种实用强大功能

    10. 支持直接获取图像数组,方便二次开发 11. 支持多点找色 键鼠方面 1. 所有键鼠接口都支持windows消息模拟,dx以及前台 2. 前台完全模拟,功能和按键自带的完全一样 3. 后台windows消息模拟(类似于按键自带的后台...

Global site tag (gtag.js) - Google Analytics