这几天学习QT的2D绘图,可因为坐标系统把我拦住了。不但资料少,而且这些资料都是内容雷同。本来这是件非常简单的事情,却有种越描越黑的感觉。经过几天的折腾,总算是理解了这层关系。现在总结一下,不要让大家再走冤枉路。
一、我们为什么要有两种坐标系统?
谈到QT绘图都会跟你说到好几个坐标系,然后就开始被绕晕了。那为什么会这么啰嗦呢?我们换个角度来想一下我们要在屏幕上显示一个图形,程序需要知道哪些东西?
首先你得有一个具体的可描述尺寸的对象,比如现在有一个手机150x50mm,或者一个图片800x600像素,又或者一个房子占地30x6米。这是具体的,与显示设备无关的单位。描述这些内容的坐标系称为逻辑坐标系。因为眼睛看不来那么多东西,所以你还会有一个特别关注的地方,比如说一幅上百米的清明上河图,你要是拉远了就可以看到全部,拉近了就只能看到几个人的画像。描述你需要关注的这个部分矩形就是窗口,决定了你需要显示的内容。
接下来是显示器,这是一个以像素为基本单位进行描述的设备。比如说1024x768分辨率的显示器,或者说一个100x200像素的QWidget。那么描述这种环境的坐标系就是物理坐标系。要正确显示的话,程序需要知道的也是两个方面的东西,你在设备环境的什么地方,以多大的范围给你显示出来。
先看一会图,再来扯具体的概念性的东西~~
二、概念理解
1、逻辑坐标与窗口
逻辑坐标:现实工作中作用的坐标系统称为逻辑坐标,使用的单位称为逻辑单位。比如说一个手机尺寸150*50mm。该系统是与显示设备无关的。比如我们常见的Y轴向上的数学坐标系。
窗口:逻辑环境中的一小部分,是一个矩形框,使用逻辑单位。可以理解为需要显示在屏幕上的显示范围。比如说一部手机,我要放大只看手机屏幕那一部分,那么手机屏幕这个部分就是窗口。如果我要缩小看放手机的桌子,那桌子范围就是窗口。可理解为需要展示的内容。
2、设备环境与视口
设备坐标:显示器、打印机,具体的显示控件等等为设备环境。为了便于理解,以下可用QWidget指代设备环境。它的坐标系为设备坐标系(或物理坐标系)。显示器以像素为单位,打印机以点为单位。原点在左上角,正X轴向右,正Y轴向下,固定不变,不可修改!其X、Y的负半轴为虚设,超出设备的部分无法显示或无法打印图形。不管最终的转换结果如何,最后图形还是要转换成屏幕上最终的像素点上。利用QT的方法取得的坐标值一般就是这个。比如QWidget内部的任一点有它位于QWidget左上角的相对坐标位置和位于整个屏幕的绝对坐标位置。利用鼠标的事件event->pos()得到的坐标值是在QWidget内的相对坐标位置,而event->globalPos()的则是位于整个屏幕的绝对位置。
视口:设备环境中的一部分,一个矩形框,使用的单位同设备环境相同。设置视口相当