Qt中的坐标变换

来源:互联网 发布:手机文字游戏制作软件 编辑:程序博客网 时间:2024/04/28 10:13

在QWidget中绘图,需要经过两次坐标变换:1、将World坐标转换为Window坐标。2、将Window坐标转换为设备坐标。下面分别描述

1、World坐标转换为Window坐标
在Qt中,Window坐标是这个二维绘图区域的逻辑坐标,向左x增长,向下y增长。但是,我们定义图元时使用的坐标系统可能和Qt的定义不同,因此需要通过坐标变换将world坐标转换为Window坐标。Qt使用QTransform表示坐标变换矩阵。

2、Window坐标转换为设备坐标

Qt最终要在设备上完成绘图,因此需要将Window坐标转换为设备的坐标,如(QWidget坐标)。一般设备坐标都是以实际的像素为单位,而逻辑坐标则没有这个限制。这样就很方便,可以按照绘制内容的坐标设定Window坐标。比如,我们想要绘制一幅图像,在Window坐标按照图像的尺寸指定矩形区域(setWindow()),然后在这个矩形区域中绘图,而不需要考虑显示窗口(QWidget)实际的尺寸。要将在逻辑空间中(Window坐标)绘制的图像在窗口中显示,需要在窗口中定义一个矩形区域(setViewport()),与逻辑空间的矩形区域匹配,有了这两个矩形,绘图系统就知道需要如何进行坐标变换,将Window坐标转换为设备坐标。可以调用deviceTransform()得到这个变换矩阵。


经验:

如果假设Window坐标与设备坐标一致(默认情况),那么通过World-Window坐标变换就可以完成World坐标到设备坐标的转换。这样做有一个好处,就是可以保存World-Window变换矩阵m,绘图时设置变换矩阵painter.setTransform()完成World-Window坐标转换;当就是当需要一个反向变换时(设备坐标到World坐标),如将鼠标事件的坐标(为设备坐标)转换为world坐标,只需要将m求逆就可以得到方向映射矩阵了。


注释:

使用deviceTransform()可得到window-device的变换矩阵,但是得到的并不是当前Widget的变换矩阵,好像是整个应用程序窗口的变换矩阵(即包含当前窗口的平移量)。用这个矩阵进行反向转换坐标就会不对。

0 0
原创粉丝点击