Qt视图场景框架之仿射变换

来源:互联网 发布:知乎提问没人浏览 编辑:程序博客网 时间:2024/05/21 05:17

仿射变换是几何空间的坐标系变换,是最常用的空间坐标系变换之一,在计算机图形图像等领域有着重要的应用。包含的变换操作包括:缩放、旋转、平移、偏移。

数学原理

仿射变换可以简单理解为计算对现有坐标点的缩放、旋转、平移和偏移操作后在新坐标系中的坐标点的的值,在代数实现形式上采用矩阵乘向量的方法计算表示变换过程。

其一般形式如下:

即:

       


这个变换可以根据矩阵T中的所选择的值,对一组坐标点做缩放、旋转、平移或偏移。

基本变换过程如下表:


变换名称仿射矩阵T坐标公式样例示意恒等变换

缩放变换


旋转变换

平移变换

(垂直)偏移变换

(水平)偏移变换


Qt视图场景框架
 

Qt提供了强大的View/Scene 框架来解决二维图形绘制操作管理,简化了二维图形开发复杂度。该框架抽象出三个层次:图形视图类(Graphics View)、图形场景类(Graphics Scene)和图形元件类(Graphics Item)。

图形视图类(Graphics View)

图形视图类主要实现二维图形的绘制相关设置和人机交互接口,为场景提供可视化绘制区域。

图形场景类(Graphics Scene)

图形场景类作为图形元件容器,提供统一的图形元件管理接口,统一管理鼠标键盘事件和元件状态相关。

图形元件类(Graphics Item)

图形元件类主要实现基本的图形绘制抽象,支持二维几何图形、文本和SVG绘制,支持多种键鼠事件响应、drag drop操作、图形组合和碰撞检测等图形操作。

视图场景中的坐标系

视图坐标系(View Coordinates)

视图坐标系以视图可视窗口左上角为(0, 0)点,x轴向右正方向延伸,y轴向下正方向延伸,原始的鼠标和拖拽事件都会以视图坐标系触发,依次传递给场景坐标系和元件坐标系处理。

场景坐标系(Scene Coordinates)

场景坐标系直接与图形元件交互,一般也是开发过程中最常使用的坐标系,该坐标系默认以视图窗口中心点为(0, 0)点,向右向下为正方向。该坐标系可以通过相关设置操作修改原点坐标点到视图窗口中任意位置。图形元件的仿射变换操作也作用于该坐标系。

元件坐标系(Item Coordinates)

元件坐标系一般以元件可视区域左上角为(0, 0)点,该坐标系一般应用在图形元件自身或子元件绘制操作时,可以理解为元件内部元素的相对坐标。

以上坐标系坐标点可以通过mapTo***和mapFrom***系列函数进行相互映射转换,仿射变换即是作用于这一坐标变换的变换规则,Qt提供了QTransform类实现了变换规则定义。

视图场景框架中的仿射变换——QTransform

Qt提供了QTransform类来定义仿射变换操作,QTransform提供接口可以完成构造仿射变换矩阵T

一般可以通过构造函数构造矩阵T

QTransform(qreal m11, qreal m12,  qreal m13, qreal m21, qreal m22, qreal m23, qreal  m31, qreal m32, qreal m33 = 1.0)

QTransform(qreal m11, qreal m12,  qreal m21, qreal m22, qreal dx, qreal dy)

QTransform(const QMatrix &matrix)

通常情况下我们通过设置接口来构造矩阵T

QTransform & rotate(qreal angle,Qt::Axis axis = Qt::ZAxis)    //旋转操作

QTransform & scale(qreal sx, qreal sy)                                  //缩放操作

QTransform & shear(qreal sh, qreal sv)                                 //偏移操作

QTransform & translate(qreal dx, qrealdy)                            //平移操作

 

QTransform提供了一系列map函数支持几何图形的快速变换。

 

QTransform在视图场景中的使用

图形元件使用QTransform实现在场景中坐标变换,利用

voidQGraphicsItem::setTransform(const QTransform&matrix, bool combine = false)方法设置变换规则,参数combine标识是否合并变换规则,默认不合并。通过合并多个变换规则可以实现复杂的图形几何变换,满足多种需求场景。

 

注意QGraphicsItem:: transform()与QGraphicsItem::sceneTransform()的区别,transform()为item自身变换,不包含位置信息,sceneTransform()包含item在scene中的位置信息。

QGraphicsItem::itemTransform(constQGraphicsItem *other, bool*ok)获取当前item相对于other的transform,是相对变换,参考物是other。在组合元件操作时常用,可以获取item相对组合父item的变换,保持多元件相对位置不变。


原创粉丝点击