Windows GDI中的坐标系(二)

原创 2003年11月04日 01:30:00

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" />CSDN_Dev_Image_2003-11-31633140.gif

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

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

 

简单的说说对GDI+坐标系的理解

小弟初学GDI+,对坐标系之间的转换不是很明白,下面是我粗浅的理解,希望各路前辈和高人指出其中的错误,不甚感激! [color=#FF00FF][/color] 1. 三种坐标系 在GD...
  • wishfly
  • wishfly
  • 2013年04月12日 17:47
  • 1262

模拟GDI+中的坐标系转换

通过模拟GDI+中的坐标系转换方法,深入彻底理解转换原理,做到知其然必知其所以然。心中有原理,手上才能写出出色的代码。...
  • smstong
  • smstong
  • 2013年08月10日 20:33
  • 2737

GDI 坐标系统与坐标变换(转)

win32程序使用坐标系统之间的变换完成图形的缩放、旋转、平移等输出操作。win32下面总共使用四个坐标空间:世界坐标系、页面坐标系、设备坐标系和物理坐标系(包括客户区、桌面或打印纸等)。每个坐标空间...
  • fengxiaochenduanduan
  • fengxiaochenduanduan
  • 2013年12月24日 22:09
  • 1032

[win32] GDI绘图常用的三种坐标系

GDI绘图常用的三种坐标系:  屏幕坐标系 ,  窗口坐标系  和  客户区坐标系 1. 屏幕坐标系:    坐标原点在屏幕左上角, 自左向右x坐标增大 , 自上向下y坐标增大.  通过 GetWin...
  • qq_15567051
  • qq_15567051
  • 2015年02月03日 13:23
  • 484

从GDI到GDI+使用的坐标系看微软二维绘图思路的进步

1 微软Windows绘图系统使用的三种坐标系 为了便于绘制,微软在其绘图系统中引入了三种不同的坐标系,这三种坐标系都是平面直角坐标系,下面从坐标系的三要素即度量单位、坐标原点、坐标轴方向分别对其进...
  • smstong
  • smstong
  • 2014年02月27日 18:52
  • 3559

Windows GDI+坐标系统详解

Windows GDI+坐标系统解析。
  • smstong
  • smstong
  • 2011年05月09日 04:16
  • 11124

利用c++实现数值坐标刻度生成,并利用GDI绘制

给定两个数值如(3001,5020),如何做到均匀地标注刻度? 研究matlab图形刻度会发现,在matlab中,图像无论如何缩放,坐标刻度间隔都是以1,2,5为基数,按照10倍或者0.1倍的幂进行放...
  • jiangjjp2812
  • jiangjjp2812
  • 2016年09月30日 19:31
  • 1826

C# GDI三种坐标系及颜色等常用结构

C#中GDI三种坐标系及颜色等常用结构
  • New_Teacher
  • New_Teacher
  • 2016年03月28日 08:57
  • 1602

Windows GDI中的坐标系(一)

Windows GDI中的坐标系(一)By leezy_2000                          2003-10-21 16:13 如果你用GDI输出过文本、位图、或者绘制过如直线、...
  • leezy_2000
  • leezy_2000
  • 2003年11月04日 01:30
  • 3056

vb.net GDI+入门——坐标系统与像素

GDI+绘图技术中,最基本的是坐标系统,坐标系统的默认度量单位是像素。我们需要熟练掌握GDI+中坐标的变换概念才能绘制出理想的图形来。 在GDI+中,默认的坐标系统的原点是在左上角,X轴指向右边,Y...
  • wyhappy612
  • wyhappy612
  • 2011年11月21日 17:21
  • 1306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows GDI中的坐标系(二)
举报原因:
原因补充:

(最多只允许输入30个字)