逻辑坐标系 设备坐标系 客户坐标系 屏幕坐标系

转载 2011年01月12日 15:04:00

(1)Windows坐标系统

Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。

 

<1>逻辑坐标系(Logical Coordinate)是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。

<2> 设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角,不限定在设备显示区域的左上角。

 

设备坐标系分为屏幕坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。

屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。

 

 

窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。

客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

 

下面三种都是显示设备的物理坐标,它们在屏幕上用真实的物理像素表示

 

  • 屏幕坐标 Screen   coordinates:   原点(0,0)位于屏幕的左上角  
  • 窗口坐标 Window   coordinates:   原点(0,0)位于窗口的左上角(包括非客户区,如标题条)  
  • 客户区坐标 Client-window   coordinates:   原点(0,0)位于客户窗口的左上角

 

逻辑坐标是GDI函数在屏幕上显示数据所用的坐标,逻辑坐标除非与物理坐标相关联,否则没有义。windows依靠映射模式解释逻辑坐标。比如缺省的模式为MM_TEXT,该模式下,物理坐标与逻辑坐标是一对一的关系。

 

      逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下: 

  1. 窗口为非滚动窗口 

  2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。

  在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻 

  坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC 函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。

 

(2)坐标之间的相互转换

编程时,有时需要根据当前的具体情况进行三种设备坐标之间或与逻辑坐标的相互转换。

MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。

MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。

 

(3)映射模式

映射模式确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向,所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角。此外,对于某些映射模式,用户还可以自定义窗口的长度和宽度,设置视图区的物理范围。

Windows定义了8种映射模式,见下表。

映射模式使得程序员可不必考虑输出设备的具体设备坐标系,而在一个统一的逻辑坐标系中进行图形的绘制。

映射方法(Mapping Mode)
逻辑单位
坐标轴方向

MM_TEXT(默认方式)
1 pixel
X轴正方向朝右,Y轴正方向朝下

MM_LOMETRIC
0.1 mm
X轴正方向朝右,Y轴正方向朝上

MM_HIMETRIC
0.01 mm
X轴正方向朝右,Y轴正方向朝上

MM_LOENGLISH
0.01 inch
X轴正方向朝右,Y轴正方向朝上

MM_HIENGLISH
0.001 inch
X轴正方向朝右,Y轴正方向朝上

MM_TWIPS
1/1440 inch
X轴正方向朝右,Y轴正方向朝上

MM_ISOTROPIC
自定义(X=Y)
自定义

MM_ANISOTROPIC
自定义(X!=Y)
自定义

当绘制的图形需要随着窗口的大小改变而自动改变的时候,一般选择MM_ISOTROPIC和MM_ANISOTROPIC映射方式。它们的唯一区别就是前者的X轴和Y轴的逻辑单位的大小是相同的,单词“isotropic”就是各个方向相等的意思,此映射方式适合绘制圆或正方形。而实际应用中,常常给X轴和Y轴取不同的比例,这时候选择MM_ANISOTROPIC映射方式。单词“anisotropic”就是各个方向相异的意思。

(4)自定义映射模式

“窗口”和“视口”的概念:

窗口(Window):对应逻辑坐标系上程序员设定的区域

视口(Viewport):对应实际输出设备上程序员设定的区域

窗口原点是指逻辑窗口坐标系的原点在视口(设备)坐标系中的位置,视口原点是指设备实际输出区域的原点。

除了映射模式,窗口和视口也是决定一个点的逻辑坐标如何转换为设备坐标的一个因素。一个点的逻辑坐标按照如下式子转换为设备坐标:

设备(视口)坐标 = 逻辑坐标 – 窗口原点坐标 + 视口原点坐标

//定义坐标映射方式

WINGDIAPI int   WINAPI SetMapMode(HDC, int);

此API函数在MFC中封装为CDC::virtual int SetMapMode(int nMapMode);

//定义逻辑窗口区域,单位为逻辑单位(Logical)

WINGDIAPI BOOL WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);

此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);

//设置逻辑窗口的原点坐标,缺省原点为(0,0)。

WINGDIAPI BOOL WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);

此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y);

注意:SetWindowOrg(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。

//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel)

WINGDIAPI BOOL WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);

此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int cy);

注意:SetViewportExt(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。

//设置视口的原点坐标,缺省原点为(0,0)。

WINGDIAPI BOOL WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);

此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);

VC中坐标系的建立 逻辑坐标,物理坐标,设备坐标

VC中坐标系的建立 逻辑坐标,物理坐标,设备坐标 建立一个合适的坐标系可以为我们的绘图带来很大的方便。下面介绍一下如何在VC中建立我们想要的坐标系。   一 设备坐标和逻辑坐标 ...

坐标系转换,客户区坐标转换成逻辑…

客户区坐标转换成逻辑坐标或其它你想要的坐标。 转换坐标核心代码如下,其中最关键的一步为pDC->SetMapMode(MM_LOMETRIC);设置映射模式 CMyDoc* pDoc = GetDoc...

VC中坐标系的建立 逻辑坐标,物理坐标,设备坐标

详析VC中坐标系的建立(逻辑坐标及物理坐标(设备坐标))2009-11-13 20:30建立一个合适的坐标系可以为我们的绘图带来很大的方便。下面介绍一下如何在VC中建立我们想要的坐标系。  一 设备坐...

06-世界坐标系的原点为什么是左下角而不是屏幕中心

OpenGL 默认的坐标原点是屏幕的正中心,而cocos2dx是如何将屏幕的左下角作为原点的呢? 猜测是设置了摄像机 结果猜测对了! 1.AppController.mm  didFinishL...

Cocos2dx 世界、屏幕、openGL、本地等坐标系

Cocos2dx 坐标系

计算机屏幕坐标系

http://blog.csdn.net/songjinshi/article/details/7215104 常用的屏幕坐标系有如下图所示的两种: http://blog.csd...
  • ybhjx
  • ybhjx
  • 2016年01月05日 18:15
  • 249

cocos2d-x 坐标系总结(从如何判断精灵是否在屏幕可见范围谈起)

萌生系统了解这方面的问题这个念头, 是因为今天刚遇到的一个问题。 最近在写一个跑酷游戏,基于cocos2d-x。  在死亡判断的时候,有一个情况,就是主角被移出了屏幕可见范围,则判断为死亡。(玩过天...

ArcGIS Server 客户端开发中如何使用自定义坐标系

1  场景描述 本文的应用场景,是要通过某市的行政区划,去查询覆盖指定县市的影像数据。其中行政区划采用Xian80地理坐标系,而影像数据则采用了该市的地方平面坐标系,因此需要进行坐标转换。 下...
  • esricd
  • esricd
  • 2012年08月07日 11:36
  • 4965

世界坐标系空间,页面空间,设备空间,物理设备空间

一、坐标空间 1、Win32应用程序设计接口(API)使用四种坐标空间:世界坐标系空间、页面空间、设备空间和物理设备空间。应用程序运用世界坐标系空间对图形输出进行旋转,斜切或者反射。 2、Win32 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:逻辑坐标系 设备坐标系 客户坐标系 屏幕坐标系
举报原因:
原因补充:

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