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
クラスの方が効率的である可能性があります。