Qt图形视图框架绕不开的问题 - 坐标系

    上一篇了解了图形视图框架的构成。现在来了解一下在使用这个框架经常打交道的坐标系。坐标系有什么好了解的呢?不就是一个X轴和一个Y轴吗?对于QPainter确实是这样,Qt的坐标系对于x轴而言往右值增大(原点左为负),对于y轴而言往下值增大(原点上为负),y轴和以前在数学上学习的坐标系是相反的。画一张比较low的示意图如下:

    blob.png

    

    当然图形视图框架的坐标系可没有那么简单,不然就没什么可说的了。那么图形视图框架的坐标系又有什么不一样的呢?还记得框架是由三个部分组成的,每一个部分都有自己的坐标系,这样这个框架就有三个坐标系了(这还不包括全局坐标系)。接下来分别聊聊这三个坐标系。

    在开聊之前首先要明确一点,所谓坐标系就是一个相对的概念。怎么理解这句话,比如说在一个图中有一个坐标点为(10,20),为什么这个点是10和20而不是30和40呢?10和20就是相对于一个点而言的,它不不是绝对的。这个相对的点就是所谓坐标系的原点。相对于某个坐标系点的坐标是多少,换个说法就是在某个坐标系中点的坐标是多少。

    图形视图框架的三个坐标系分别是视图坐标系、场景坐标系和图元坐标系。三个坐标系分别由视图、场景和图元使用。比如在给场景中添加图元时,图元的位置就是相对于场景坐标系而言的。 在定义图元的形状时如上一篇中的矩形图元(-30,-30,60,60),这里的-30和60就是相对于图元坐标系而言的。再画一个比较Low的图表示三个坐标系如下:

    blob.png

    真是麻烦,对于一个点只要有一个坐标系就好了,为什么还要搞三个坐标出来呢?那是因为三个部分是相对独立的,一个场景既可以用这个视图来渲染也可以用另一个视图来渲染,图元可以放在这个场景里也可以加到另一个场景里。在最终关联在一起之前他们是没办法用一个坐标系统一的,而且我在定义图元的时候,我根本不关心在场景里会是什么样子的,我只要按照自己的坐标系来定义好数据就可以了。三个部分使用各自的坐标系让整个框架使用起来更加的灵活。

    再回到上面一部分,我们说坐标系是一个相对的概念,既然这样那么在这里有三个坐标系肯定会涉及到坐标转换的问题。比如说图二所示的基础上有个需求,要在圆角矩形的右下角位置显示一个窗口怎么办?我们知道圆角矩形的右下角点是多少,但是这是相对于图元坐标系而言的,而显示窗口位置使用的是视图坐标系,这就必须要将圆角矩形右下角这个点的坐标值转换为在视图坐标系下是多少。如果是按图中那样还好通过计算图元的位置和场景的位置也容易算出来,但是如果图元经过旋转、缩放和变形后这个值就不容易计算了。好在Qt提供了这些计算方法,我们只需调用就好了。这些函数以map开头如下图所示图元类提供的坐标转换函数:

blob.png

不仅可以转换点的坐标还能直接转换矩形、多边形、以及路径等。

    坐标系是图形视图框架中非常重要的一部分内容,但是由于很抽象难以理解,需要在实践中多去体会。


    我是fearlazy!文章内容仅代表个人观点如有雷同纯属正常。




演示站
上一篇:Qt之 Graphics View Framework's ABC
下一篇:Qt图形视图框架基本图元

发表评论

评论列表

2019-02-14 10:10:51

写的不错