Qtにおける角度・弧度変換と三角関数の実装

Qtアプリケーション開発において、幾何計算やグラフィックス処理を行う際には角度(degree)と弧度(radian)の相互変換が頻繁に必要となる。C++標準ライブラリおよびQtフレームワークは、三角関数の計算をサポートしているが、注意すべき点がある。

角度と弧度の変換

C++の<cmath>ヘッダで提供される三角関数(sin, cos, tanなど)は、引数として弧度法(radian)を要求する。したがって、ユーザー入力やUIで扱う角度(度数法)をこれらの関数に渡す前に変換が必要である。

変換式は以下の通り:

  • 角度 → 弧度:radian = degree * (π / 180)
  • 弧度 → 角度:degree = radian * (180 / π)

QtではM_PI定数(<cmath>または<qmath.h>経由)を使用できるが、C++20以降ではstd::numbers::piも利用可能。以下に実用的なヘルパー関数を示す:

#include <cmath>

inline double degToRad(double degrees) {
    return degrees * (M_PI / 180.0);
}

inline double radToDeg(double radians) {
    return radians * (180.0 / M_PI);
}

三角関数の使用例

例えば、角度45度の正弦値を求める場合:

double angleDeg = 45.0;
double angleRad = degToRad(angleDeg);
double sineValue = std::sin(angleRad); // ≈ 0.7071

逆三角関数(asin, acos, atan)は弧度で結果を返すため、必要に応じてradToDegで変換する。

const参照による効率的なコンテナ走査

Qtのコンテナ(QList, QVectorなど)を走査する際、要素のコピーを避けるためにconst参照を使用することが推奨される。特にカスタム型や大きなオブジェクトではパフォーマンスに顕著な影響が出る。

QList<QPointF> points = /* ... */;
for (const QPointF& pt : points) {
    // ptは元の要素への読み取り専用参照
    qDebug() << "x:" << pt.x() << ", y:" << pt.y();
}

要素を変更する必要がある場合は非const参照を使用するが、意図しない変更を防ぐため、読み取り専用の場合は常にconst&を用いるべきである。

静的メソッドとインスタンスメソッドの使い分け

ユーティリティ関数(例:角度変換)は、状態を持たないためstaticメソッドとして設計すると自然である:

class MathUtils {
public:
    static double toRadians(double degrees) {
        return degrees * (M_PI / 180.0);
    }

    static double toDegrees(double radians) {
        return radians * (180.0 / M_PI);
    }
};

このようにすれば、オブジェクトの生成なしにMathUtils::toRadians(90)のように呼び出せる。一方、オブジェクト固有の状態(例:現在の回転角)を操作するメソッドはインスタンスメソッドとして実装する。

タグ: Qt C++ 三角関数 角度変換 コンテナ最適化

6月17日 18:39 投稿