2

drawLine()関数が影響するポイント/座標のリストを取得するにはどうすればよいですか?たとえば、私が持っている場合

QLineF line(10.0, 80.0, 90.0, 20.0);
QPainter(this);
painter.drawLine(line);

drawLine()が描画するQPoint座標のリストを取得したいと思います。私はブレゼンハムのラインアルゴリズムを知っていますが、異なるQPenとQBrushを設定できるより一般的なケースで機能するためにこれが必要です。

painter.setPen(QPen(myColor, myWidth, Qt::SolidLine, Qt::RoundCap));

また、同じエンドポイントとパラメーターで線を描画する可能性があるが、Qtがない他のプログラムと一貫性を保つ必要があるため、同じ結果になり、1つずつ違いがないようにします。

注:これはこの質問とは異なります。ポリゴン/パスの頂点だけでなく、描画関数の影響を受けるすべてのピクセルが必要だからです。

更新:QImageまたはQPainterDeviceとQPaintEngineをサブクラス化して、すべての「setPixel()」操作をキャッチすることは可能だと思います。誰かが他の方法で証明したり確認したり、それを行うための短いコードを書いたりすることはできますか?

4

2 に答える 2

2

パフォーマンス要件は不明ですが、ラインを画面外にレンダリングしてから画像を見て、どのピクセルがペイントされたかを確認できます。190,190 から 210,210 までの 400x400 画像の 3 ピクセル ラインの間に描かれたピクセルを印刷する例を次に示します。

QImage を使用する場合は、パフォーマンス上の理由から必ず scanLine() 関数を使用してください。

#include <QCoreApplication>
#include <QImage>
#include <QPainter>
#include <QDebug>

int main(int argc, char *argv[])
{
    QImage image(400,400,QImage::Format_ARGB32);
    QPainter painter;
    painter.begin(&image);
    painter.fillRect(0,0,400,400,QBrush(Qt::white));
    QBrush brush(Qt::black);
    QPen pen(brush, 3.0);
    painter.setPen(pen);
    painter.drawLine(190,190,210,210);
    painter.end();

    for (int i=0;i<image.height();i++) {
        const uchar *scanLine = image.scanLine(i);
        for (int j=0;j<image.width()*4;j+=4) {
            if ( scanLine[j] == 0 ) {
                qDebug() << "pixel" << i << j/4 << scanLine[j];
            }
        }
    }

    return (0);
}
于 2012-09-11T03:46:47.643 に答える
0

カバーされる正確なピクセルは、Qt プログラム内で必ずしも一貫しているわけではありません。でアンチエイリアシングをオンにしたQPainter場合、 に描画した場合はQGLWidget異なります。また、プログラムが実行されているプラ​​ットフォームによって異なる場合があります。Qt には異なるQPaintEngine実装があり、必ずしも正確に生成するとは限らないためです。同じ出力。

要するに、あなたが求めていることは不可能です。特定のペイント操作でカバーされたピクセルのみを見つけることができます.mzelinaによって提案されたアプローチをとることによってのみそれを行うことができます.

于 2012-09-18T15:33:11.393 に答える