Qt4 Gossip: QMatrix
来源:互联网 发布:高薪职业知乎 编辑:程序博客网 时间:2024/06/11 05:55
转载自http://hi.baidu.com/touchao/item/7a51b2e3d0e08710595dd845
QPainter默认的坐标系统是绘图装置的坐标系统,也就是左上角为原点,向右为正X,向下为正Y的坐标系统,坐标系统的转换常使用矩阵的方式来表现及进行运算,QMatrix的作用,正是让您可以利用其内建的矩阵,设定好相关的参数,然后让QPainter根据QMatrix的设定,来进行一些二维坐标系统的转换动作。
QMatrix的内部使用一个3x3的矩阵:
m11 m12 0 m21 m22 0 dx dy 1
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
当您使用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();
}
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- Qt4 Gossip: QMatrix
- QMatrix
- Qt4 Gossip: QMutex 與 QMutexLocker
- Qt4 Gossip: Model 與 View 類別
- Qt4 Gossip: QPixmap、QBitmap、QImage 與 QPicture
- Qt4 Gossip: 循序容器(QVector、QLinkedList、QList...) - 转
- Qt4 Gossip: 循序容器(QVector、QLinkedList、QList...) - 转
- 关于QMatrix
- QMatrix实践
- Gossip
- Gossip
- QT4
- qt4
- Qt-图像绘制控制之QMatrix类
- Gossip简介
- HDU1142 A Walk Through the Forest
- Double Dealing----HDU4259----找规律
- ]VS2010 语法错误: 标识符“__RPC__out_xcount_part” 解决方法
- 程序运行时堆区和栈区的分配
- 使用Vitamio打造自己的Android万能播放器(9)—— 在线播放 (在线电视)
- Qt4 Gossip: QMatrix
- 关闭页面和刷新页面后 触发服务器事件 采用body的onbeforeunload()方法
- 下载文件的四种方法 C#篇收藏
- anaconda安装程序分析
- SQLite数据库
- 谈微信营销
- .NET(C#)下的移动彩信MM7协议研究之路(二)
- 什么是Nib文件
- anaconda安装程序分析2