Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108721
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 636
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-22 19:31
文章分类

全部博文(87)

文章存档

2015年(33)

2014年(37)

2013年(17)

我的朋友

分类: C/C++

2014-04-23 10:18:43

QT坐标个人理解
参考网址:
      对于一个给定的绘图设备,在绘图时有两个坐标系:物理坐标系,逻辑坐标系。物理坐标系是一个真实的坐标系,在QT中,其原点处于绘图设备的左上角,其单位长度为绘图设备上一像素长度,其X轴向右增长,Y轴向下增长。而逻辑坐标系是一个抽象的坐标系,其原点、单位长度没有实际意义,其X轴向右增长,Y轴向下增长。
绘图时,图像绘制在逻辑坐标系上,再通过窗口——视口映射,世界转换将逻辑坐标系映射到物理坐标系上。进而把绘制在逻辑坐标系上的图像映射到物理坐标系上。
       文档中描述是先进行世界转换,再进行窗口——视口映射,将逻辑坐标系具体化意思是确定逻辑坐标系的原点与单位长度)。
       首先进行窗口(window)——视口(viewport)转换:
转换公式为(一般不需要自己计算):
(原x1-原x0)*新宽度/旧宽度-新x0=新x1(正逆变换都适用)(原表示将要变换的坐标,新表示变换之后的坐标)
       首先需要了解的是:窗口基于逻辑坐标系,视口基于物理坐标系。使用以下两个函数可以得到一个基于逻辑坐标系的窗口矩形,与一个基于物理坐标系的视口矩形。
void QPainter::setWindow ( int x, int y, int width, int height ) 
void QPainter::setViewport ( int x, int y, int width, int height )
       窗口——视口转换就是通过这两个矩形,将逻辑坐标系映射到物理坐标系上(也可以说是把逻辑坐标系具体化)。其确定方式是通过在物理坐标系上移动,拉伸逻辑坐标系,使得窗口矩形与视口矩形重合,此时经过移动拉伸得到的逻辑坐标系便是其在物理坐标系上的映射。接着是世界转换。世界转换有以下四种方式(目前我了解的):
(1)    translate( )        平移。
(2)    scale( )            拉伸,缩放。
(3)    rotate( )            旋转。
(4)    shear( )            扭曲。
       世界转换就是在已经具体化的逻辑坐标系的基础上,对其进行平移,拉伸,缩放,旋转,扭曲等操作。需要注意的是每次的世界转换都是在上一次世界转换的基础上进行的。世界转换的过程是一个状态机转换的过程。因此先平移再旋转,与先旋转再平移所得的结果是不同的。通过上述映射,在逻辑坐标系上绘制的图像便能转换为物理坐标系上的图像。
例子一:
 setFixedSize (300,300);
 painter.setWindow (0,0,300,300);
 painter.drawRect(20,20,50,50);

易知逻辑坐标=物理坐标

例子二:
setFixedSize (300,300);
painter.setWindow (20,20,300,300);
painter.drawRect(20,20,50,50);

例子三:
setFixedSize (300,300);
painter.setWindow (0,0,150,150);
painter.drawRect(20,20,50,50);

例子四:
setFixedSize (300,300);
painter.setViewport (0,0,150,150); 
painter.drawRect(20,20,50,50)

阅读(564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~