QMatrix
来源:互联网 发布:命令模式 java 编辑:程序博客网 时间:2024/06/11 10:42
QPainter預設的座標系統是繪圖裝置的座標系統,也就是左上角為原點,向右為正X,向下為正Y的座標系統,座標系統的轉換常使用矩陣的方式來表現及進行運算,QMatrix的作用,正是讓您可以利用其內建的矩陣,設定好相關的參數,然後讓QPainter根據QMatrix的設定,來進行一些二維座標系統的轉換動作。
QMatrix的內部使用一個3x3的矩陣:
m11m120m21m220dxdy1
dx與dy定義了水平與垂直移動,m11與m22定義了水平與垂直縮放(scaling),m12與m21定義了垂直與水平扭曲(shearing),想像您是坐在太空船中,在太空船從左上原點開到某個點之後,(x, y)是以您為中心所看到的座標,但實際上太空船相對於左上角為原點的座標為(x', y'),QMatrix的矩陣可以如以下的公式,將(x, y)轉換為(x', y'):
當您使用QPainter要進行繪圖時,可以您為中心所看到的座標系統(x, y),使用QPainter的相關API來進行相關圖形的繪製,這就像您在太空船中畫圖一樣的方便,若有設定QMatrix,則會自動轉換為電腦繪圖時所 看到的座標系統(x', y'),如此就不用親自進行一些複雜的轉換動作,進行繪圖時也較為直覺。
您可以藉由QMatrix的setMatrix()方法設定m11、m12、m21、m22、dx、dy,或者是直接使用translate()、rotate()、scale()與shear()等方法來直接進行移動、旋轉、縮放、扭曲等座標轉換。
以下的範例為色彩輪的繪製,藉由設定HSV(Brightness,Hue, Saturation)中的「色相」來完成彩虹般的效果,HSV中的「色相」(Hue)是錂鏡分光,主要有紅、橙、黃、綠、藍、紫...等八個主要色相。「亮度」(Brightness)是明暗表現,由白至黑的 表現,在P.C.C.S(Practical Color Coordinate System)配色系統中,將之分為白、淺灰(淺,深)、淺中灰、中灰、暗中灰、暗灰(淺,深)、黑等。「彩度」(Saturation)也就是色彩的飽 和程度,彩度最高的稱之為「純色」,最低為「無顏色」。
下圖為執行時的參考畫面:
QMatrix的內部使用一個3x3的矩陣:
m11m120m21m220dxdy1
dx與dy定義了水平與垂直移動,m11與m22定義了水平與垂直縮放(scaling),m12與m21定義了垂直與水平扭曲(shearing),想像您是坐在太空船中,在太空船從左上原點開到某個點之後,(x, y)是以您為中心所看到的座標,但實際上太空船相對於左上角為原點的座標為(x', y'),QMatrix的矩陣可以如以下的公式,將(x, y)轉換為(x', y'):
x' = m11*x + m21*y + dx
y' = m22*y + m12*x + dy
y' = m22*y + m12*x + dy
當您使用QPainter要進行繪圖時,可以您為中心所看到的座標系統(x, y),使用QPainter的相關API來進行相關圖形的繪製,這就像您在太空船中畫圖一樣的方便,若有設定QMatrix,則會自動轉換為電腦繪圖時所 看到的座標系統(x', y'),如此就不用親自進行一些複雜的轉換動作,進行繪圖時也較為直覺。
您可以藉由QMatrix的setMatrix()方法設定m11、m12、m21、m22、dx、dy,或者是直接使用translate()、rotate()、scale()與shear()等方法來直接進行移動、旋轉、縮放、扭曲等座標轉換。
以下的範例為色彩輪的繪製,藉由設定HSV(Brightness,Hue, Saturation)中的「色相」來完成彩虹般的效果,HSV中的「色相」(Hue)是錂鏡分光,主要有紅、橙、黃、綠、藍、紫...等八個主要色相。「亮度」(Brightness)是明暗表現,由白至黑的 表現,在P.C.C.S(Practical Color Coordinate System)配色系統中,將之分為白、淺灰(淺,深)、淺中灰、中灰、暗中灰、暗灰(淺,深)、黑等。「彩度」(Saturation)也就是色彩的飽 和程度,彩度最高的稱之為「純色」,最低為「無顏色」。
#include <QApplication>#include <QWidget>#include <QPainter>#include <QMatrix>class PainterWidget : public QWidget {protected: void paintEvent(QPaintEvent*);};void PainterWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); QFont font("times", 18, QFont::Bold); painter.setFont(font); painter.setPen(Qt::black); for (int i = 0; i < 36; i++) { // 進行 36 次旋轉 QMatrix matrix; matrix.translate(250, 250); // 移動中心至 (250, 250) matrix.shear(0.0, 0.3); // 扭曲 matrix.rotate((float) i * 10); // 每次旋轉 10 度 painter.setWorldMatrix(matrix); // 使用這個 QMatrix QColor color; color.setHsv(i * 10, 255, 255); // 設定彩虹效果 painter.setBrush(color); // 設定筆刷顏色 painter.drawRect(70, -10, 80, 10); // 畫矩形 QString str; str.sprintf("H=%d", i*10); painter.drawText(80 + 70 + 5, 0, str); // 繪製角度文字 }}int main(int argc, char *argv[]) { QApplication app(argc, argv); PainterWidget pWidget; pWidget.setWindowTitle("QMatrix"); pWidget.resize(500, 500); pWidget.show(); return app.exec();}
下圖為執行時的參考畫面:
https://www.openhome.cc/Gossip/Qt4Gossip/QMatrix.html
阅读全文
0 0
- QMatrix
- 关于QMatrix
- QMatrix实践
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- Qt-图像绘制控制之QMatrix类
- 用QMatrix实现帧的旋转、翻转、放大、缩小等简单操作示例
- VC2008出现warningC4996的解决方法
- Swift 中的关键字 final和super
- 从菜鸟到架构师(二十六)
- RPC 测试报错Unkown protocol(com.boco.hadoop.client.LoginServiceInterface)
- 正阅读微信小说分销系统-教程-如何申请模板消息
- QMatrix
- HTTP协议—— 简单认识TCP/IP协议
- Session
- vue-router -- 嵌套路由
- HTTP中Get与Post的区别
- 野生程序员眼中的Linux系统
- jQuery简介
- linux下使用 du查看某个文件或目录占用磁盘空间的大小
- Java多线程--并发中集合的使用之ConcurrentHashMap