SetWindowOrg SetViewportOrg DC 的坐标
2011-04-28 08:22:52| 分类:
VC++
| 标签:
|举报
|字号大中小 订阅
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);
评论这张
转发至微博
转发至微博
评论