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分别进行设置和读取。用这两个函数进行操作时,所涉及的坐标为设备空间的坐标。
视口范围: 视口范围并不是一个绝对的用于表示设备坐标空间大小的值。而是一个相对值,它同窗口范围的比例最终决定页面坐标空间到设备坐标空间是一种缩小还是放大的转换。用SetViewportExtEx、GetViewportExtEx对视口范围进行存取。
窗口原点:页面坐标空间的原点。用SetWindowOrgEx、GetWindowOrgEx对窗口原点进行存取,所涉及的坐标为逻辑坐标。
窗口范围:见视口范围的说明。用SetWindowExtEx、GetWindowExtEx进行存取。
由了两个坐标空间的原点值和范围的比例值,在这两个坐标空间间进行坐标转换也就不是什么太难的事了。比较容易的可以得出下面的公式:
页面坐标空间到设备坐标空间:
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 图形编程》
分享到:
相关推荐
在这个主题中,我们将深入探讨如何使用C# GDI+来绘制直角坐标系,并实现自定义的图形绘制,如矩形和圆形。 首先,我们需要导入`System.Drawing`命名空间,这是C#中GDI+的核心库。在窗体或控件的Paint事件处理程序中...
这个映射过程使得在逻辑坐标系中绘制的图形在设备坐标系中的位置发生了变化。 另一方面,`SetViewportOrg`函数用于设定视口的原点,即设备坐标系的参考点。当你调用`SetViewportOrg(x, y)`,这意味着设备坐标系的...
本文从GDI 映射方式入手, 对基于设备坐标的视口和基于逻辑坐标的窗口的概念、内涵及其相互关系进行了分析...在此基础上, 文章详述了怎样建立不同原点、单位和正方向的逻辑坐标系, 对坐标系的构建原理进行了深入剖析。
本篇文章将详细探讨如何利用C#的GDI功能在PictureBox控件中初始化一个坐标系,并在该坐标系内绘制曲线和点。 首先,我们需要了解GDI的基础概念。GDI提供了一系列的函数和对象,如Graphics、Pen、Brush等,它们分别...
【学习笔记】Windows GDI绘图(三)坐标系和坐标转换 【学习笔记】Windows GDI绘图(四)矩阵Matrix详解 【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上) 【学习笔记】Windows GDI绘图(六)图形路径...
在编程中,通常会将图形的数学模型定义在这个坐标系中。 设备坐标系则是与显示器或打印机等硬件紧密相关的坐标系。在Windows环境中,设备坐标系的原点位于屏幕的左上角,X轴正向右延伸,Y轴正向下延伸。每个单位...
世界坐标空间是指三维空间中的一种坐标系,而页面坐标空间是指二维空间中的一种坐标系。从世界坐标空间到页面坐标空间的变换是GDI坐标变换中的一项重要内容。 (1)平移变换 平移变换是指将图形元素沿着某个方向...
在Windows中,默认的坐标系统采用笛卡尔坐标系,其中坐标原点位于屏幕的左上角,水平坐标轴正方向向右,垂直坐标轴正方向向下。例如,如果使用Ellipse函数绘制一个圆形,则需要根据这个坐标原点来指定圆形的位置和...
在本文中,我们将深入探讨如何在VC++6环境中利用GDI+库来创建一个功能完备的2维坐标系。GDI+(Graphics Device Interface Plus)是Microsoft推出的一个图形处理库,它扩展了传统的GDI(Graphics Device Interface)...
综上所述,"C#画坐标系及曲线"的实现涉及了Windows Forms的基本使用、GDI+图形绘制技术以及数据驱动的图形展示。通过理解这些概念和方法,你可以创建出具有交互性和可视化的应用程序,用于数据展示、分析或其他图形...
在C# 2010中,我们可以使用GDI+(Graphics Device Interface Plus)库来绘制这样的坐标系。 1. **初始化图形对象**: 在C#中,`System.Drawing.Graphics` 类提供了绘制图形的方法。你可以通过窗体的`Paint`事件...
它通过设备上下文(Device Context, DC)的概念,将逻辑坐标转换为设备坐标,使得在逻辑坐标系上的绘图操作能够映射到不同的物理设备上。 GDI函数分为多个类别,包括设备上下文管理、绘图、填充、属性设置、文本...
本项目“C# 地图显示缩放 坐标系动态显示”着重探讨如何在Windows应用程序中实现地图的显示、缩放以及动态坐标系的呈现。 首先,我们需要了解基础的地图数据表示方式。在计算机科学中,地图通常被转化为栅格或矢量...
在对话框上绘制坐标系,我们需要使用GDI(Graphics Device Interface),这是Windows API的一部分,用于处理图形输出。我们主要会用到`CDC`(设备上下文)类,它是MFC对Windows GDI的封装,提供了绘图操作接口。 ...
在VC6中使用GDI+绘制2维图形是一项常见的任务,尤其对于开发Windows桌面应用程序的程序员来说。GDI+(Graphics Device Interface Plus)是微软推出的一个图形处理库,它扩展了传统的GDI功能,提供了更丰富的图形绘制...
为了方便绘图,GDI 提供了坐标系转换的功能,包括屏幕坐标与客户区坐标的转换。 **API 函数:** - `PtToLP`: 将逻辑坐标转换为物理坐标。 - `LPtoDP`: 将物理坐标转换为逻辑坐标。 - `ScreenToClient`: 将屏幕坐标...
8. **窗口和视口**:GDI在窗口系统中管理窗口和视口,确保图形在正确的坐标系下绘制,并且能正确响应窗口大小变化。 9. **光栅操作**:GDI提供了光栅操作,如位运算,用于像素级别的图像处理。 GDI+是GDI的增强...
GDI(Graphics Device Interface)是微软Windows操作系统提供的图形设备接口,它为应用程序提供了绘制图形、处理图像和文本的基本功能。对于初学者而言,理解和掌握GDI的基本绘图方法是非常重要的。 #### 使用GDI...
2. **MM_ISOTROPIC**: 保持窗口和视口中的图形对称,坐标系设定为Optional,但X轴和Y轴的比例固定为1:1。 3. **MM_TEXT**: 默认的映射模式,一个逻辑单位映射成什么由系统确定。 映像模式的选择会影响图形的呈现...