jupyter中怎么把图形在一个单独的窗口显示_QT绘图中的坐标概念

学习《QT 5.9 C++开发指南》的第8章“绘图”,其中有两个概念:视口和窗口。

这两个概念及其之间的关系让我很迷糊。“视口”这个名词在很多文章中出现过,大部分文章指的是图形显示设备的显示区域;但QT中不是这个意思,因为使用了设置视口这个函数后,绘制的图形仍然可以在设置的视口区域之外显示。

仔细研究了QT的说明文档和示例代码,对这两个概念有了一定的了解:

  1. 首先视口和窗口这两个概念只涉及坐标系转换,和内容是否显示无关;
  2. “窗口”使用“逻辑坐标系”表示;
  3. “视口”使用“物理坐标系”表示;

第2、3中的描述在很多文章中都是如此描述,但没有更近一步的说明,理解比较困难;

先说“物理坐标系”:

指的是在绘图设备(paint device)绘图的坐标系,比如在一个窗口上绘图,就需要一个坐标系,有三个关键要素:

  • 原点位置:左上方;
  • 方向:X向右,y向下;
  • 单位:像素;

这个容易理解,windows上一般的绘图坐标系都是如此;

再说“逻辑坐标系”:

在考虑这个坐标系之前,先把QT、绘图设备、接口等等具体和实现有关的东西放一边,它到底是什么呢?

假设我们想画一个圆,为了描述准确一点,我们同时给出一个坐标系来描述这个圆:

圆心坐标是(50, 0),半径是50;

这个坐标系就是一个逻辑坐标系,里面的圆就是我想绘制的图形。现在我想在一个窗口中绘制这个圆,看看还需要哪些信息?

比如:需要放到哪个地方呢?中间?偏左?偏右?圆的比例有多大?

这些信息如何处理和表述呢?

这里引入了一个“窗口”的概念,即QT文档中的"window",

我们使用一个窗口,也就是矩形,来衡量这个圆在这个矩形的位置,以及比例大小,来模拟我们希望在窗口中显示的内容;

这里显示了两幅图,可以看到"window"就像取景器一样,虽然都是同一个圆,但圆和矩形的比例、间隔等不同,导致这两个显示内容是有差别的;

上面就是逻辑坐标系、窗口的概念。

现在,使用”window”这个取景器选好了图形,我希望这个图形显示到一个窗口中,怎么做呢?

为了简化,以便在显示的时候,和物理坐标系对应,我们重新建立一个逻辑坐标系,下图红色部分,几个关键点:

  • Window:左上角、右下角在逻辑坐标系中的坐标;
  • 圆在这个坐标系中的坐标;
  • 原点位置:可以任选,怎么方便怎么来;不一定非得是window的左上角;
  • 方向:X向右,y向下;和物理坐标系一致;
  • 单位:单位距离;或者说没有具体的单位,因为只是示意图,没有对应到具体的事物;

重温“逻辑坐标系”这个词,为什么叫“逻辑”?因为和在什么平台、什么显示设备无关;

现在我想要在将上面的window绘制到一个窗口中,具体做法是在窗口中间开辟一个和window同比例的矩形,然后将这个图形绘制到这个窗口的矩形中。

为什么要同比例?就像放大缩小照片一样,我不想让照片变形,因此需要同比例;

一般有两种做法绘制:

  1. 将window中的图形坐标进行计算转换(这个计算转换需要我们自己写程序),转换完后,调用API进行绘制;这个转换过程一般比较繁琐;
  2. 让QT帮我们实现这个转换:

具体做法:

  1. 设置window的逻辑坐标系的坐标,比如window左上角的坐标位置,右下角的坐标位置;
  2. 设置我们想要在窗口中显示的位置(viewport),主要是左上角、右下角的位置;
  3. 绘制图形(绘制图形使用的是逻辑坐标系);

逻辑坐标系和物理坐标系的转换方法:

注意,如果在window之外绘制的图形,会显示出来。window和viewport只涉及坐标系转换。

本文链接:https://my.lmcjl.com/post/4442.html

展开阅读全文

4 评论

留下您的评论.