登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

SetWindowOrg SetViewportOrg DC 的坐标  

2011-04-28 08:22:52|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
SetWindowOrg SetViewportOrg DC 的坐标
SetWindowOrg SetViewportOrg, 在 显示器中的形象解释、验证,(打印机上未验证,也许不同,没有打印机所以暂时没有验证)
这里只是说一下原点坐标。在一个程序中遇到DC 的坐标问题,也是一直没有搞明白。
这次在网上搜索,确实有几个帖子说的比较详细,但是还是不容易理解,不形象。所以细细的想了一下,并通过程序验证正确。形象具体的总结了一下:

有三个坐标系
1、 世界坐标系,这个我们可以认为是固定不变的一个坐标系,一个网状的坐标格子,在最底层。 (该坐标在函数使用中没有涉及,但是一定有,帮助理解)。
2、 设备坐标,也就是viewport坐标。这个就是图形设备,打印机什么的,可以想象为一张纸,用于绘图的纸张。 dc 的绘图动作, 使用的坐标就是相对该坐标的,这个很重要。
比如 dc.Rectangle(0, 0, 200, 200);无论viewport 原点在哪里, 该矩形都是 以viewport 的原点 的 一个200*200 的dc.Rectangle;
  比如 pDC->SetViewportOrg(100, 100);
  pDC->Rectangle(0, 0, 200, 200); 
  该矩形还是在viewport中的 0, 0, 200, 200。 但是 在世界坐标中,该矩形为 100, 100, 300, 300, 因为该矩形是相对 ViewportOrg 定位的坐标
  无论 viewport 在哪里,window org 在哪里,最后绘制的图形可以在世界坐标中找到,而且位置都是确定的:通过viewportorg偏移找到。
 
3、 窗口坐标,windoworg,也是我们创建的窗口, 这个就是透过该坐标 我们看见的世界中的图形,你的照相机。也就是所有图形已经通过2中的坐标关系被绘制在世界坐标中,通过本规则移动一个窗口,移动到你想看的地方,然后世界坐标的景物就在你的窗口中了。就像一个照相机一样,随便怎么移动,只是景物在照相机中的位置变化,但是景物的在自然世界的位置是没有变化的。而移动相机和景物的位置就是相反的。比如你把相机左移动,景物就在你的相机中向右移动,反之亦然。
  在2 中 只是移动了 view port,此时,窗口仍然在 0,0 所以看见的图形如下:矩形被绘制在了世界坐标的 100,100 处, 窗口(照相机)在世界坐标的0,0点。
  《 无耻,csdn 插图片都那么费劲吗,那么难做吗?看来以后不应该来这个破地方了》


 现在移动窗口(你的照相机),到与 viewportorg 重合,则效果如下,透过窗口看,世界的景物到了窗口的左上角了。而移动窗口时,绘制在世界坐标中的景物位置没有变的。可以任意移动“照相机”,景物会在“照相机”中的位置发生相应变化
  《 无耻,csdn 插图片都那么费劲吗,那么难做吗?看来以后不应该来这个破地方了》
 
总结一下:图形绘制,坐标是相对 viewport的坐标,但是图形绘制完毕,是固定在世界坐标不会改变的;window窗口是你的照相机,移动窗口,景物会在照相机中发生变化。
  这个是形象的解释了,没有量化的坐标换算,这个换算公式有很多介绍的,所以能形象了,公式就很好办了:)


理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:

page space---->device space
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(40,0);  //这句“设定”page space的原点为(40,0),注意,
//这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这
//一句对下面的画图函数在page space中所作的图不会有任何影响。一句话:SetWindowOrg
//就是指定一下,page space中哪个点为原点。
pDC->Rectangle(0,0,100,-100);
pDC->Rectangle(0,-100,50,-200);

同理,SetViewportOrg也是指定一下,device space中哪个点为原点,两个坐标系映射时,两个原点重合。

SetWindowExt设定page space的大小,SetViewportOrg设定device space的大小,其实,真正有意义的只是两者的比例关系,例如,在一个1024*768的显示屏上:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(10240,7680);
pDC->SetViewportExt(1024,768);
pDC->Rectangle(0,0,100,100);

  就会画一个10 pixels*10 pixels的矩形。其本质就是,X方向,每个逻辑单位有1024/10240个象素,Y方向每个逻辑单位有768/7680个象素。因此,下面的代码有相同的作用:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(102400,76800);
pDC->SetViewportExt(10240,7680);
pDC->Rectangle(0,0,100,100);
  评论这张
 
阅读(5753)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018