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)のように呼び出せる。一方、オブジェクト固有の状態(例:現在の回転角)を操作するメソッドはインスタンスメソッドとして実装する。