坐标转换:Windows编程中的映射模式和坐标转换

、Windows中映射模式
1、Windows定义映射模式
经过我综合Windows定义映射模又以下几个方面:1、区别人使用习惯区别国家区别地区以及区别习惯喜欢用区别度量单位人人喜欢用英寸而有人喜欢用公制中厘米毫米等其他人又喜欢用另外些单位、2、使软件Software和硬件向分离开来让开发软件Software能够最大限度和硬件无关3、提供逻辑和物理种转换就相当于银行利率
2、默认映射模式
默认映射模式使MM_TEXT,它使以象素为单位X轴向左为正Y轴向下为正默认坐标原点在左上角
3、固定比例映射模式
固定比例映射模式有MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS种它们默认坐标原点都使在左上角其区别在于每个逻辑单位对应物理大小不所对用逻辑单位分别为0.1毫米0.01毫米0.01英寸0.001英寸1/1440英寸(0.0007英寸)
4、可变比例映射模式
对于可变比例映射模式用户可以自己定义个逻辑单位代表大小其大小可以任意也可以让这个大小随环境改变而改变有MM_ISOTROPICMM_ANISOTROPIC这两种映射模式其逻辑单位大小等于视口范围和窗口范围比值两者区别在于前者要求X轴和Y轴度量单位必须相同而后者没有这样限制
2、Windows中几种坐标体系
1、屏幕坐标
屏幕坐标描述物理设备(显示器、打印机等)种坐标体系坐标原点在屏幕左上角X轴向右为正Y轴向下为正度量单位是象素原点、坐标轴方向、度量单位都是不能够改变
2、设备坐标(又称物理坐标)
设备坐标是描述在屏幕和打印机显示或打印窗体种坐标体系默认坐标原点是在其客户区左上角X轴向右为正Y轴向下为正度量单位为象素原点和坐标轴方向可以改变但是度量单位不可以改变
3、逻辑坐标
逻辑坐标是在中控制显示打印使用坐标体系该坐标系和定义映射模式密切相关默认映射模式是MM_TEXT我们可以通过设置区别映射模式来改变该坐标体系默认行为
3、逻辑坐标和设备坐标的间转换
现有如下代码:
void CMapModeView::OnPa
{
CPaDC dc(this);

//获取设备类设置
CPo ptOrgView,ptOrgWindow;
CSize sizeView,sizeWindow;
CString strMsg;

ptOrgView=dc.GetViewportOrg;//获取视口原点
ptOrgWindow=dc.GetWindowOrg;//获取窗口原点
sizeView=dc.GetViewportExt;//获取视口范围
sizeWindow=dc.GetWindowExt;//获取窗口范围

strMsg.Format(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
sizeView.cx,sizeView.cy,ptOrgView.x,ptOrgView.y,
sizeWindow.cx,sizeWindow.cy,ptOrgWindow.x,ptOrgWindow.y);
TRACE("%s\n",strMsg);

//设置映射模式以及原点
dc.SetMapMode(MM_TEXT);//设置映射模式
dc.SetWindowOrg(100,100);//设置窗口坐标原点
dc.SetViewportOrg(200,200);//设置视口坐标原点

dc.SetWindowExt(5,10);//改语句仅对可变比例映射模式有效
dc.SetViewportExt(1,1);//同上

ptOrgView=dc.GetViewportOrg;
ptOrgWindow=dc.GetWindowOrg;
sizeView=dc.GetViewportExt;
sizeWindow=dc.GetWindowExt;
strMsg.Format(_T("Viewport Extent:(%d,%d),\tViewport Org:(%d,%d)\tWindow Extent:(%d,%d)\tWindow Org(%d,%d)"),
sizeView.cx,sizeView.cy,ptOrgView.x,ptOrgView.y,
sizeWindow.cx,sizeWindow.cy,ptOrgWindow.x,ptOrgWindow.y);
TRACE("%s\n",strMsg);

//将点(300,400)从逻辑坐标体系映射到设备坐标体系
CPo ptMap;
ptMap=CPo(300,400);
dc.LPtoDP(&ptMap);
strMsg.Format(_T("The Orginal Po(In LP):CPo(300,400),Convert to DP is:CPo(%d,%d)"),
ptMap.x,ptMap.y);
TRACE("%s\n",strMsg);

//将点(300,400)从设备坐标体系映射到逻辑坐标体系
ptMap=CPo(300,400);
dc.DPtoLP(&ptMap);
strMsg.Format(_T("The Orginal Po(In DP):CPo(300,400),Convert to LP is:CPo(%d,%d)"),
ptMap.x,ptMap.y);
TRACE("%s\n",strMsg);
}
以上代码最后调试输出结果为:
Viewport Extent:(1,1), Viewport Org:(0,0) Window Extent:(1,1) Window Org(0,0)
Viewport Extent:(1,1), Viewport Org:(200,200) Window Extent:(1,1) Window Org(100,100)
The Orginal Po(In LP):CPo(300,400),Convert to DP is:CPo(400,500)
The Orginal Po(In DP):CPo(300,400),Convert to LP is:CPo(200,300)
按照MSDN上SetWindowOrg(x,y)设定设备坐标下点(xy)对应于逻辑坐标原点SetVieportOrg(x,y)设定逻辑坐标下点(xy)对应逻辑坐标原点而实际上如果同时设置了逻辑坐标和设备坐标原点那么以上说法是
在默认映射模式MM_TEXT下,个逻辑单位对应于设备坐标下个象素改变默认原点以后坐标体系如下图所示:
(0,0)              DxLx       (0,0)                             
(100,100)                      Lx
(200,200)                  Dx
 .(300,400)



Dy,Ly                                Ly  Dy
在VC中坐标系转换和数学中数学转化是不在这里是以距离为标准首先看下如何把点(300400)如何从设备坐标转换成逻辑坐标
在设备坐标体系下点(300400)和Y轴距离为100个逻辑单位那么所对应逻辑坐标也要满足和逻辑坐标Y轴距离为100个单位又1个逻辑单位对应1个象素所以所对应设备坐标X值为100+100=200同样可以出对应逻辑坐标Y值为300
按照同样思路方法我们也可以把逻辑坐标下点(300400)转换成设备坐标在逻辑坐标下点(300400)和逻辑坐标Y轴距离为200那么在设备坐标体系相应设备坐标和设备坐标Y轴距离也要为200又1个逻辑单位对应1个象素所以对应设备坐标X值为200+200=400同样道理可以求出对应设备坐标Y值为500
在这里逻辑单位和设备单位对应也可以把这个问题看作个很简单坐标平移问题来看其结果是很显然
Tags:  坐标转换软件 坐标转换

延伸阅读

最新评论

发表评论