私は、基本的に、幾何学的形状を(「左のキャンバス」内の)多くの小さな三角形にカットし、いくつかの単純な数学的変換を三角形の束に適用し、それらを新しい構成で再描画するプログラムを設計しました。以下のスクリーンキャプチャを参照してください。
これらの三角形を描くために、私はを使用しますQPainter::drawPolygon
。右側の各三角形は左側の三角形に対応しているので、それを描くためにどの色を使用したいかがわかります。
これまでのところ、結構です。これよりもはるかに多くの三角形を描画したとしても(形状をカットするためにはるかに小さな三角形を使用する場合)、これは十分に高速です。
プログラムに機能を追加しました。単純な三角形の代わりに、画像から抽出した三角形を描画できます。次のスクリーンキャプチャを参照してください。
問題は、私がこれを行う方法が遅すぎることです。これが私がそれをする方法です:
- 私はすべての三角形を駆け抜けます
- 三角形ごとに、表示される各ピクセルの座標を計算します。
- これらのピクセルのそれぞれについて、画像上の対応するピクセルの座標を計算し(これは簡単な数学演算です)、そのピクセルの色を取得します。
- とを使用
QPainter::setPen(QColor)
しQPainter::drawPoint(QPoint)
てピクセルを描画します。
私はQtでのプログラミングに不慣れで、グラフィックスについて何も知らないので、これが私が思いついたものです。問題は、それが「許容できないほど」遅すぎることです(paintEvent
プレーンな三角形の場合の0.01秒と比較して、各キャンバスの所要時間は約0.15秒です)。
何が起こっているのかを理解するためにプロファイラーを実行しましたが、キャンバスウィジェットpaintEvent
の
- 時間の58%は
QPainter::drawPoint
- 時間の27%が
QPainter::setPen
QPainter::drawPoint
複雑すぎて遅いようです。特定の色のピクセルを印刷したいだけです。それだけです。
私は自分の問題の解決策を見つけたかもしれません:QImage
キャンバスに表示させたいもの全体を表す(キャンバスウィジェットのメンバー変数として)を保存し、それpaintEvent
をピクセルごとに完全に定義してから、一度に描画します私の最後paintEvent
にQPainter::drawImage
。これははるかに高速になるというヒントがあります。しかし、コードを書き直す前に、それが本当にやりたいことなのかどうかを知りたいと思います。
私はあなたが死ぬのを退屈させなかったことを望みます!洞察に感謝します。