• 16435阅读
  • 2回复

Qt坐标系转换过程的个人理解,大家过来指点下 [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2011-01-20
— 本帖被 XChinux 执行加亮操作(2011-01-21) —
关键词: 坐标系
      QT坐标系转换机制的个人理解
      对于一个给定的绘图设备,在绘图时有两个坐标系:物理坐标系,逻辑坐标系。物理坐标系是一个真实的坐标系,在QT中,其原点处于绘图设备的左上角,其单位长度为绘图设备上一像素长度,其X轴向右增长,Y轴向下增长。而逻辑坐标系是一个抽象的坐标系,其原点、单位长度没有实际意义,其X轴向右增长,Y轴向下增长。
绘图时,图像绘制在逻辑坐标系上,再通过窗口——视口映射,世界转换将逻辑坐标系映射到物理坐标系上。进而把绘制在逻辑坐标系上的图像映射到物理坐标系上。
       注意:在个人理解中,是先进行窗口——视口映射,再进行世界转换。(但文档中描述是先进行世界转换,再进行窗口——视口映射,这点想不通。如果不先通过窗口——视口映射将抽象的逻辑坐标系具体化,对其进行世界转换有什么意义?将逻辑坐标系具体化意思是确定逻辑坐标系的原点与单位长度)。
       首先进行窗口(window)——视口(viewport)转换:
       首先需要了解的是:窗口基于逻辑坐标系,视口基于物理坐标系。使用以下两个函数可以得到一个基于逻辑坐标系的窗口矩形,与一个基于物理坐标系的视口矩形。
void QPainter::setWindow ( int x, int y, int width, int height )
void QPainter::setViewport ( int x, int y, int width, int height )
       窗口——视口转换就是通过这两个矩形,将逻辑坐标系映射到物理坐标系上(也可以说是把逻辑坐标系具体化)。其确定方式是通过在物理坐标系上移动,拉伸逻辑坐标系,使得窗口矩形与视口矩形重合,此时经过移动拉伸得到的逻辑坐标系便是其在物理坐标系上的映射。
      接着是世界转换。世界转换有以下四种方式(目前我了解的):
(1)    translate( )        平移。
(2)    scale( )            拉伸,缩放。
(3)    rotate( )            旋转。
(4)    shear( )            扭曲。
       世界转换就是在已经具体化的逻辑坐标系的基础上,对其进行平移,拉伸,缩放,旋转,扭曲等操作。需要注意的是每次的世界转换都是在上一次世界转换的基础上进行的。世界转换的过程是一个状态机转换的过程。因此先平移再旋转,与先旋转再平移所得的结果是不同的。
       通过上述映射,在逻辑坐标系上绘制的图像便能转换为物理坐标系上的图像。
注:窗口——视口转换只是提供一种从逻辑坐标系到物理坐标系的映射方式,并不起到剪切区域的作用,就是说画在逻辑坐标系窗口矩形外的图像也会映射到物理坐标系上,并显示出来。
       如果不使用setWindow指定窗口矩形,则窗口矩形默认设置为绘图设备矩形。此默认设置同样适用于视口矩形(绘图设备为QWidget,QPixmap之类的东西)。
       上面就是我对QT坐标系转换的个人理解,其中最疑惑的是关于世界转换与窗口——视口映射执行的先后顺序。是先世界转换,再窗口——视口映射;还是先窗口——视口映射,再世界转换?请教各位啦。
离线XChinux

只看该作者 1楼 发表于: 2011-01-24
高等代数、高等几何学好了,这些多容易理解啊。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线thansky
只看该作者 2楼 发表于: 2011-03-22
个人理解是先进行世界变换 ,然后再进行窗口 视口映射,个人感觉与opengl是一样的,先不要考虑物理坐标系的结构是怎么样的,然后先考虑逻辑坐标系中的物体,将逻辑坐标系中的物体通过平移 旋转等操作确定好逻辑坐标系统的场景,就是其中各个物体之间的相对位置,然后像照相机一样,把这个场景照下来,然后再将获取的照片进行拉伸,使窗口同视口一样大。

再有感觉你说的窗口和视口也同opengl中的不同,窗口就是窗体,视口就是窗口的一部分用来显示的区域。

小弟也是刚刚接触qt opengl  ,理解的有啥不正确的希望大侠们指点。
快速回复
限100 字节
 
上一个 下一个