只讨论非定比例的映射模式:SetMapMode(MM_ANISOTROPIC)
映射模式要用到的四个函数:
SetWindowExt
SetViewportExt
SetWindowOrg
SetViewportOrg
视口中用的是设备坐标,窗口中用的是逻辑坐标。因为这个特点,给人的感觉就是视口是一张真正的存在的纸,而窗口是你看到的纸的那一部分。
对于前两个函数有一种非常好的理解方式,最开始时我就是这么理解的。同样一张纸(比如一张A4纸),然后用两种单位来比划这张纸,例如用英寸和厘米,或是你自己定义一个单位。SetViewportExt说这有一张100*200像素大小的纸,SetWindowExt说“我不用你的单位,我说它是4000*80000”。
后来才发现,这个问题用数学来描述到简洁、明白的多,就是两个坐标系建立映射的过程。
先不管我们看到了什么,就想像同一个空间被两个坐标系表示,一个是Viewport,一个是Window。空间中一个确定点,在Viewport中有个坐标(x0,y0),在Window中也有一个坐标(x1,y1)。你通过设置这两个函数,也就告诉了系统这两个坐标是怎么映射并转化的。
比如在设备坐标中x0=300,y0=200,x1=3000,y1=-200.这样你画图时就相当于是在wx-wy坐标里画。
再说SetWindowOrg,SetViewportOrg
如果只设置SetViewportOrg,对你在wx-wy坐标里画图没有任何影响,只是你移动了视角,视野变了而以。
而SetWindowOrg则是在相对于那张纸平移了自己的坐标系(wx-wy),
表面上看,两个好像没有什么区别,但下面这种情况就显现区别出来了。先将SetViewportExt设为整个窗口大小,SetWindowExt可以随便设。
有一个现像,你只用SetViewportOrg设坐标后(不用SetWindowOrg),改变窗口的大小、形状后,坐标原点离左边窗的距离在像素数上是不变的。
而只用SetWindowOrg设置坐标后,改变窗口后,坐标原点离左边窗的距离是改变的。
浙公网安备 33010602011771号