日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【Qt】2D绘图之坐标系统

發布時間:2024/4/24 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】2D绘图之坐标系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 開發環境
    • 03. Qt坐標系統
    • 04. 坐標系統變換
    • 05. 平移變換
    • 06. 縮放變換
    • 07. 扭曲變換
    • 08. 旋轉變換
    • 09. 附錄

01. 概述

Qt中每一個窗口都有一個坐標系統,默認的,窗口左上角為坐標原點,水平向右依次增大,水平向左依次減小,垂直向下依次增大,垂直向上依次減小。原點即為(0,0)點,以像素為單位增減。

02. 開發環境

Windows系統:Windows10

Qt版本:Qt5.15或者Qt6

03. Qt坐標系統

程序示例

void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setBrush(Qt::red);painter.drawRect(0, 0, 100, 100);painter.setBrush(Qt::yellow);painter.drawRect(-50, -50, 100, 100); }

執行結果

04. 坐標系統變換

默認的,QPainter在指定設備的坐標系統上進行繪制,在進行繪圖時,可以使用QPainter::scale()函數縮放坐標系統;使用QPainter::rotate()函數順時針旋轉坐標系統;使用QPainter::translate()函數平移坐標系統;還可以使用QPainter::shear()圍繞原點來扭曲坐標系統。如下圖所示。

坐標系統的2D變換由QTransform類實現,我們可以使用前面提到的那些便捷函數進行坐標系統變換,當然也可以通過QTransform類實現。

05. 平移變換

程序示例

//平移變換 void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setBrush(Qt::yellow);painter.drawRect(0, 0, 50, 50);//相當于將(100,100)設為原點painter.translate(100, 100);painter.setBrush(Qt::red);painter.drawRect(0, 0, 50, 50);//相當于在原來原點的基礎之上減去(100, 100)當做新的原點painter.translate(-100, -100);painter.drawLine(0, 0, 20, 20); }

執行結果

這里先在原點(0, 0)繪制了一個寬、高均為50的正方形,然后使用translate()函數將坐標系統進行了平移,使(100, 100)點成為了新原點,所以我們再次進行繪制的時候,雖然drawRect()中的邏輯坐標還是(0, 0)點,但實際顯示出來的卻是在(100, 100)點的紅色正方形。可以再次使用translate()函數進行反向平移,使原點重新回到窗口左上角。

06. 縮放變換

程序示例

//縮放變換 void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setBrush(Qt::yellow);painter.drawRect(0, 0, 100, 100);//放大兩倍painter.scale(2, 2);painter.setBrush(Qt::red);painter.drawRect(50, 50, 50, 50);}

執行結果

可以看到,當我們使用scale()函數將坐標系統的橫、縱坐標都放大兩倍以后,邏輯上的(50, 50)點變成了窗口上的(100, 100)點,而邏輯上的長度50,繪制到窗口上的長度卻是100。

07. 扭曲變換

程序示例

//扭曲變換 void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setBrush(Qt::yellow);painter.drawRect(0, 0, 50, 50);//縱向扭曲變換painter.shear(0, 1);painter.setBrush(Qt::blue);painter.drawRect(50, 0, 50, 50); }

執行結果

shear()有兩個參數,第一個是對橫向進行扭曲,第二個是對縱向進行扭曲,而取值就是扭曲的程度。比如程序中對縱向扭曲值為1,那么就是紅色正方形左邊的邊下移一個單位,右邊的邊下移兩個單位,值為1就表明右邊的邊比左邊的邊多下移一個單位。大家可以更改取值,測試效果。

08. 旋轉變換

程序示例

//旋轉變換 void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.drawLine(0, 0, 100, 0);//以原點為中心 順時針旋轉30°painter.rotate(30);painter.drawLine(0, 0, 100, 0);painter.translate(100, 100);painter.rotate(30);painter.drawLine(0, 0, 100, 0); }

執行結果

程序示例二:

//旋轉變換 void Widget::paintEvent(QPaintEvent *) {QPainter painter(this);painter.drawLine(0, 0, 100, 0);//以原點為中心 順時針旋轉30°painter.rotate(30);painter.drawLine(0, 0, 100, 0);//反向旋轉painter.rotate(-30);painter.translate(100, 100);painter.drawLine(0, 0, 100, 0);painter.rotate(30);painter.drawLine(0, 0, 100, 0); }

執行結果:

這次我們在移動原點以前先將坐標系統反向旋轉,可以看到,第二次旋轉也是從水平方向開始的。

其實,前面講到的這幾個變換函數都是如此,他們改變了坐標系統以后,如果不進行逆向操作,坐標系統是無法自動復原

09. 附錄

源碼下載:【Qt】2D繪圖之坐標系統.rar

總結

以上是生活随笔為你收集整理的【Qt】2D绘图之坐标系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。