QPolygon::translate() をマスターして、Qt GUI アプリケーションをレベルアップ


QPolygon::translate() は、Qt GUI ライブラリで定義されている関数で、ポリゴンのすべての点を指定されたオフセットだけ移動します。この関数は、ポリゴンを画面上の別の位置に配置したり、アニメーション効果を作成したりする際に役立ちます。

構文

QPolygon::translate() には、2 つのオーバーロードされた形式があります。

  • QPolygon QPolygon::translated(const QPoint &offset) const
  • void QPolygon::translate(int dx, int dy)

引数

  • offset: 移動量を QPoint 型で指定します。
  • dy: Y 軸方向の移動量をピクセル単位で指定します。
  • dx: X 軸方向の移動量をピクセル単位で指定します。

戻り値

  • QPolygon 型の関数は、移動されたポリゴンの新しいコピーを返します。
  • void 型の関数は、元のポリゴンを変更します。

// ポリゴンを作成
QPolygon polygon;
polygon << QPoint(10, 20);
polygon << QPoint(50, 30);
polygon << QPoint(40, 60);

// ポリゴンを (30, 40) だけ移動
polygon.translate(30, 40);

// 移動されたポリゴンの点を表示
for (int i = 0; i < polygon.size(); ++i) {
    QPoint point = polygon.at(i);
    qDebug() << "点 " << i << ": (" << point.x() << ", " << point.y() << ")";
}

この例では、(10, 20), (50, 30), (40, 60) という座標の 3 つの点を持つポリゴンを作成します。次に、translate() 関数を使用してポリゴンを (30, 40) だけ移動します。最後に、移動されたポリゴンの各点をループで処理し、その座標を出力します。

  • QPolygon::translate() 関数は、2D グラフィックスでのみ使用できます。3D グラフィックスでは、QMatrix4x4 クラスを使用する必要があります。
  • ポリゴンを回転したりスケーリングしたりするには、QTransform クラスを使用する必要があります。
  • QPolygon::translate() 関数は、ポリゴンの形状を変更しません。移動するのは、ポリゴンの位置だけです。


例 1: ポリゴンを画面上の別の位置に配置する

この例では、三角形のポリゴンを作成し、画面の右上に配置します。

#include <QApplication>
#include <QPainter>
#include <QPolygon>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // ウィジェットを作成
    QWidget widget;
    widget.setWindowTitle("ポリゴン移動");
    widget.resize(300, 300);

    // ポリゴンを作成
    QPolygon polygon;
    polygon << QPoint(50, 100);
    polygon << QPoint(150, 200);
    polygon << QPoint(100, 50);

    // ポリゴンを (100, 100) だけ移動
    polygon.translate(100, 100);

    // ウィジェットをペイントする
    void paintEvent(QPaintEvent *event) {
        QPainter painter(&widget);
        painter.setPen(Qt::black);
        painter.drawPolygon(polygon);
    }

    QObject::connect(&widget, &QWidget::paintEvent, this, paintEvent);

    widget.show();

    return app.exec();
}

このコードを実行すると、以下の画像のようなウィンドウが表示されます。

例 2: アニメーション効果を作成する

この例では、正方形のポリゴンを画面上で左右に移動するアニメーションを作成します。

#include <QApplication>
#include <QTimer>
#include <QPainter>
#include <QPolygon>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // ウィジェットを作成
    QWidget widget;
    widget.setWindowTitle("ポリゴンアニメーション");
    widget.resize(300, 300);

    // ポリゴンを作成
    QPolygon polygon;
    for (int i = 0; i < 4; ++i) {
        polygon << QPoint(50 + 50 * i, 100);
    }

    // 移動方向と速度を初期化
    int dx = 5;
    int x = 50;

    // タイマーを作成
    QTimer timer(&widget);
    timer.setInterval(20);

    // タイマーのタイムアウトシグナルに接続
    void timeout() {
        // ポリゴンを移動
        polygon.translate(dx, 0);

        // 移動方向を反転
        if (x + polygon.at(0).x() > widget.width() || x + polygon.at(3).x() < 0) {
            dx = -dx;
        }

        // ウィジェットを再描画
        widget.update();

        // 移動位置を更新
        x += dx;
    }

    QObject::connect(&timer, &QTimer::timeout, this, timeout);

    // タイマーを開始
    timer.start();

    widget.show();

    return app.exec();
}

このコードを実行すると、以下の画像のようなアニメーションが表示されます。



QTransform クラスを使用する

QTransform クラスは、2D および 3D グラフィックスの変換を処理するために使用できます。translate() メソッドを使用してポリゴンを移動するだけでなく、回転、スケーリング、せん断などの他の変換を実行することもできます。

利点

  • より柔軟性が高い
  • より多くの変換を実行できる

欠点

  • QPolygon::translate() よりも複雑

QPolygon polygon;
polygon << QPoint(50, 100);
polygon << QPoint(150, 200);
polygon << QPoint(100, 50);

QTransform transform;
transform.translate(100, 100);

QPolygon transformedPolygon = transform.map(polygon);

ループを使用して各点を個別に移動する

この方法は、単純な移動を実行する場合に役立ちます。

利点

  • シンプルでわかりやすい

欠点

  • 多くの点を持つポリゴンに対しては非効率

QPolygon polygon;
polygon << QPoint(50, 100);
polygon << QPoint(150, 200);
polygon << QPoint(100, 50);

for (int i = 0; i < polygon.size(); ++i) {
    QPoint &point = polygon[i];
    point.setX(point.x() + 100);
    point.setY(point.y() + 100);
}

QPainter::translate()` メソッドを使用する

この方法は、描画中にポリゴンを移動する場合に役立ちます。

利点

  • 描画コードを簡潔に保つことができる

欠点

  • ポリゴンを実際に移動するわけではない

void paintEvent(QPaintEvent *event) {
    QPainter painter(&widget);

    painter.translate(100, 100);

    painter.setPen(Qt::black);
    painter.drawPolygon(polygon);
}

最適な代替方法の選択

使用する代替方法は、要件によって異なります。

  • 描画中にポリゴンを移動する必要がある場合は、QPainter::translate() メソッドを使用します。
  • シンプルでわかりやすい方法が必要な場合は、ループを使用して各点を個別に移動します。
  • 複数の変換を実行する必要がある場合は、QTransform クラスを使用します。
  • 読みやすさ: QTransform クラスを使用すると、コードが読みづらくなる場合があります。
  • コードの簡潔性: ループを使用して各点を個別に移動する方法の方が、コードが簡潔になる場合があります。
  • パフォーマンス: 大規模なポリゴンを移動する場合は、QTransform クラスの方が効率的である可能性があります。