欢迎来到天天文库
浏览记录
ID:43444419
大小:530.03 KB
页数:19页
时间:2019-10-02
《2D绘图坐标变换_计算机软件及应用_IT计算机_专业资料》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Qt学习Z路2(28)处标系统在经历过实际操作,以及前面一节屮我们见到的那个translate()函数之后,我们可以详细了解下Qt的坐标系统了。泛泛而谈坐标系统,冇时候会觉得枯燥无味,难以理解,好在现在我们已经有了基础。处标系统是山QPainter控制的。我们前而说过,QPaintDevice>QPaintEngine和QPainter是Qt绘制系统的三个核心类。QPainter用于进行绘制的实际操作;QPaintDevice是那些能够让QPainter进行绘制的“东西”(准确的术语叫做,二维空间)的抽象层(其子类有QWidget、QPixmap^QPicture^Qlmage和QPrinte
2、r等);QPaintEngine供供QPainter使川的丿IJ于在不同设备上绘制的统一的接口。[1
3、于QPaintDeice是进行绘制的对象,因此,所谓朋标系统,也就是QPaintDevice±而的坐标。默认坐标系统位于设备的左上角,也就是坐标原点(0,0)。x轴方向向右;y轴方向向下。在基于像素的设备上(比如显示器),坐标的默认单位是像素,在打印机上则是点(1/72英寸)o将QPainter的逻辑坐标与QPaintDevice的物理坐标进彳亍映射的工作,是由QPainter的变换矩阵(transfonnationmatrix)、视口(viewport)和窗口(window)完成的。如果你不
4、理解这些术语,可以简单了解下有关图形学的内容。实际上,对图形的操作,底层的数学都是进行的矩阵变换、相乘等运算。在Qt的坐标系统中,每个像素占据1X1的空间。你可以把它想彖成一张方格纸,每个小格都是1个像素。方格的焦点定义了坐标,也就是说,像素(x,y)的中心位置其实是在(x+0.5,y+0.5)的位置上。这个朋标系统实际上是一个“半像素处标系”。我们可以通过下面的示意图來理解这种坐标系:QRedd26.4)QUne(2,7.6,1)我们使川一个像素的应笔进行绘制,可以看到,每一个绘制像素都是以坐标点为中心的矩形。注意,这是坐标的逻辑表示,实际绘制则与此不同。因为在实际设备上,像素是最小单位,我
5、们不能像上而一•样,在两个像素之间进行绘制。所以在实际绘制时,Qt的定义是,绘制点所在像素是逻辑定义点的右下方的像素。我们前面已经介绍过,Qt的绘制分为走样和反走样两种。对此,我们必须分别对待。一个像素的绘制最简单,我们从这里开始:QPainterpainter(this);QPainterpainter(this);painterPen(Qt::darkGreen);painter.drawRect(1#2,€f4);painterasetPen(Qt::darkGreen};painter.drawLine(2r7f6.1);从上图可以看出,当我们绘制矩形左上角(1,2)时,实际绘制的像索
6、是在右下方。当绘制大于1个像素吋,情况比较复朵:如果绘制像素是偶数,则实际绘制会包裹住逻辑坐标值;如果是奇数,则是包裹住逻辑坐标值,再加上右下角一个像索的偏移。具体请看下面的图示:wtotopowW)1riflMOboiwxnOLogicalrepresentationiqpOwkWX)righidbonom()Onepixelwidepenurngow«h(l1nghll).KrtKxnoTwopixelwtdepenThreepixelwidepen从上图可以看出,如果实际绘制是偶数像索,则会将逻辑坐标值夹在相等的两部分像素之间;如果是奇数,则会在右下方多出一个像素。Qt的这种处理,带來的
7、一个问题是,我们可能获取不到真实的坐标值。由于历史原因,QRect::right()和QRect::boltom()的返回值并不是矩形右下角点的真实坐标值:QRect::right()返回的是left()+width()-1;QRect::bottom()则返回top()+height()-1,上图的绿色点指出了这两个函数的返回点的处标。为避免这个问题,我们建议是使用QRectFoQRectF使用浮点值,而不是整数值,来描述处标。这个类的两个函数QRectF::right()和QRectF::bottom()是正确的。如果你不得不使用QRect,那么可以利用x()+width()和y()+he
8、ight。来替代right()和bottom()函数。对于反走样,实际绘制会包裹住逻辑坐标值:QPainterpainter(thial:paintsz.3皀tRender且in匸(QPalncer::Antialidam^):pointer.3etFen(Qr::darkGreen);painter.drawRsct(1,2.6.4);QPaxnr:erpamrer(chi.3);painter
此文档下载收益归作者所有