关于QMatrix

QPainter预设的座标系统是绘图装置的座标系统,也就是左上角为原点,向右为正X,向下为正Y的座标系统,座标系统的转换常使用矩阵的方式来表现及进行运算, QMatrix的作用,正是让您可以利用其内建的矩阵,设定好相关的参数,然后让QPainter根据QMatrix的设定,来进行一些二维座标系统的转换动作。

QMatrix的内部使用一个3x3的矩阵:

 

m11

m12

0

m21

m22

0

dx

dy

1

dxdy定义了水平与垂直移动,m11m22定义了水平与垂直缩放(scaling),m12m21定义了垂直与水平扭曲(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'),如此就不用亲自进行一些复杂的转换动作,进行绘图时也较为直觉。 

您可以藉由QMatrixsetMatrix()方法设定m11m12m21m22dxdy,或者是直接使用translate()rotate()scale()shear()等方法来直接进行移动、旋转、缩放、扭曲等座标转换。 

以下的范例为色彩轮的绘制,藉由设定HSVBrightness,Hue, Saturation)中的「色相」来完成彩虹般的效果, HSV中的「色相」(Hue)是錂镜分光,主要有红、橙、黄、绿、蓝、紫...等八个主要色相。 「亮度」(Brightness)是明暗表现,由白至黑的表现,在PCCSPractical 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();
  }

下图为执行时的参考画面: 

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值