设备坐标和逻辑坐标


个人理解 : 这里指定客户区坐标系统,而非屏幕坐标或者窗口坐标系统。
设备坐标指物理设备的坐标系统,原点(0,0)一般都在左上角,因为设备坐标的间隔尺寸有可能是像素,mm 或者其它 ,所以程序员并不需要清楚设备的具体坐标表示,于是就发明了逻辑坐标。还有一点,客户区的坐标x轴往右增大,y轴往下增大。
逻辑坐标的产生完全是为了不必去考虑设备坐标的位置,能更统一的进行坐标标示,比如要定点 (100,100) 则直接用逻辑坐标的方式定到(100,100),这里就产生了这个(100,100)的坐标是怎么对应于设备坐标点的位置的问题。于是就有了逻辑坐标和设备坐标的对应关系 ,我们在进行逻辑坐标表示前,要先做好逻辑坐标和设备坐标之间换算的协议,简单点说就是os后台是根据什么公式将逻辑坐标点转换为对应的设备坐标点的。
win32下,一般先指定逻辑坐标的宽和高(自定义一个宽度和高度)用SetWindowExtEx,再指定设备坐标的宽和高(用api获得设备的真实宽和高)用SetViewportExtEx,【默认情况下将逻辑坐标的0,0 和设备坐标的0,0重叠的】,一般是左上角原点。
假设逻辑坐标的宽和高定义为100,100,那么 其意义为(0,0,100,100)这个矩形是物理设备可显示的(0,0,最大宽度,最大高度)这个可视矩形 ,我们如果 textout(hdc,100,100,TEXT("kkk"),nullptr);则这个kkk将输出在设备可视范围之外,就是说我们看不到了,可以用<100的坐标点,如 99,99这个点位来输出 kkk 还可以输出在设备可视范围之内。

但有时我们会用SetWindowOrgEx(hdc,50,50,nullptr);来重新绑定逻辑坐标(50,50)[注意这里的50,50,其实它是逻辑点,os 会根据我们之前协议好的转换协议将这个50,50转换为设备坐标的那个具体的点位 ,而且要注意是不能超出自定义的逻辑宽度和高度的]与设备坐标的(0,0)点对应 位置,此时就设置了逻辑坐标(50,50)对应到设备坐标的(0,0)位置了,当我们TextOut(hdc,0,0,TEXT("kkk"),nullptr);时(注意这个0,0也是逻辑坐标点)你在客户区就会发现输出的内容看不见了,这是因为逻辑坐标点(0,0)已经在设备坐标(0,0)点的左上角偏移过去了,所以输出时并没有输出在我们的客户区范围内。

而当我们用SetViewportOrgEx(hdc,30,30,nullptr); 时,其真实意义为逻辑点(0,0)已经和转换后的(30,30)坐标点重叠了,设备坐标(0,0)左上角原点和逻辑坐标(-30,-30)重叠了。当我们TextOut(hdc,0,0,TEXT("kkk"),nullptr);输出内容时,输出位置在客户区的右下解方向偏移了一点。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为Qt绘图基础,世界坐标系转换为逻辑坐标系。世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数取消生效,对比世界坐标系下的绘图。 重写PainterEvent函数: void QtPixPainter::paintEvent(QPaintEvent* event) { QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); //物理坐标系与逻辑坐标系的转换,如果不转换,下面的绘图都是在世界坐标系下 setWorldTransform(painter); // 其他一些绘制矩形,多边形的例子,经过上面转换,都是在逻辑坐标系下 drawRectScale(painter); //draw_shearRect(painter); //利用rotate()函数进行比例变换,实现缩放效果 //draw_rotate_act(painter); //draw_by_save_restore(painter); //transform_draw_SinX(painter); transform_draw(painter); local_drawConvexPolygon(painter); } // 将世界坐标(原点左上角)转换为逻辑坐标(原点在屏幕中间) QPointF QtPixPainter::mapToScene(const QPointF& point) { QTransform transMatrix = _transform.inverted(); //翻转矩阵? return transMatrix.map(point); //将点piont映射到transMatrix定义的坐标系中来 } // 将鼠标的逻辑位置返回并以标签形式展示 void QtPixPainter::mouseMoveEvent(QMouseEvent* event) { QString msg; QPointF mouse_po = mapToScene(event->pos()); //总是返回屏幕物理坐标系 double x = mouse_po.x(); // 总是返回屏幕物理坐标系 double y = mouse_po.y(); QString str = "(" + QString::number(x) + "," + QString::number(y) + ")"; //qDebug()<<"world x = "<pos().x()<<",world y = "<pos().y(); m_mouse_lable->setText(str); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值