QT坐标个人理解

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, intheight )
        窗口——视口转换就是通过这两个矩形,将逻辑坐标系映射到物理坐标系上(也可以说是把逻辑坐标系具体化)。其确定方式是通过在物理坐标系上移动,拉伸逻辑坐标系,使得窗口矩形与视口矩形重合,此时经过移动拉伸得到的逻辑坐标系便是其在物理坐标系上的映射。接着是世界转换。世界转换有以下四种方式(目前我了解的):
(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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值