C++でcomplexクラスを活用したジオメトリ(幾何計算)の実装方法
この記事では、C++のSTLに含まれるcomplexクラスを使ってPointクラスを作成し、幾何学関連の問題に応用する方法を解説します。複素数は、STLのcomplexクラス(#include <complex>)で簡単に扱うことができます。
Pointクラスの定義
complexをpointとして扱うために、complex<double>に「point」という別名(typedef)を付けます。さらに、complexクラスのreal()をx、imag()をyとしてマクロ定義することで、Pointクラスと同様の操作が可能になります。
#include <complex> typedef complex<double> point; #define x real() #define y imag()
注意点として、xとyはマクロとして定義されているため、変数として直接使用することはできません。
基本的な使用例
以下の実装例を見て、理解を深めましょう。
#include <iostream>
#include <complex>
using namespace std;
typedef complex<double> point;
#define x real()
#define y imag()
int main() {
point my_pt(4.0, 5.0);
cout << "The point is :" << "(" << my_pt.x << ", " << my_pt.y << ")";
}
出力
The point is :(4, 5)
幾何学的な操作への応用
このPointクラスを使えば、次のような幾何学的な計算を簡単に行えます。
- 原点(0, 0)からの距離:
abs(P) - X軸となす角度(偏角):
arg(z) - 原点を中心としたPの回転:
P * polar(r, θ)
実装例
距離・偏角・回転を求める具体的な実装例を見てみましょう。
#include <iostream>
#include <complex>
#define PI 3.1415
using namespace std;
typedef complex<double> point;
#define x real()
#define y imag()
void print_point(point my_pt){
cout << "(" << my_pt.x << ", " << my_pt.y << ")";
}
int main() {
point my_pt(6.0, 7.0);
cout << "The point is:";
print_point(my_pt);
cout << endl;
cout << "Distance of the point from origin:" << abs(my_pt) << endl;
cout << "Tangent angle made by OP with X-axis: ("
<< arg(my_pt) << ") rad = ("
<< arg(my_pt)*(180/PI) << ")" << endl;
point rot_point = my_pt * polar(1.0, PI/2);
cout << "Point after rotating 90 degrees counter-clockwise, will be: ";
print_point(rot_point);
}
出力
The point is:(6, 7) Distance of the point from origin:9.21954 Tangent angle made by OP with X-axis: (0.86217) rad = (49.4002) Point after rotating 90 degrees counter-clockwise, will be: (-6.99972, 6.00032)
まとめ
STLのcomplexクラスを活用すれば、Pointクラスを一から実装することなく、座標の管理、原点からの距離計算、偏角の取得、回転変換といった幾何学的処理を簡潔なコードで実現できます。競技プログラミングなどで幾何問題を扱う際に非常に役立つテクニックなので、ぜひ覚えておきましょう。
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ
-
C++で括弧文字列からイコールポイント(等分点)を見つける方法
この記事では、C++を使って括弧の文字列からイコールポイント(等分点)を求める方法を解説します。 イコールポイントとは? イコールポイントとは、あるインデックス i において、その位置より前にある開き括弧「(」の数と、その位置以降にある閉じ括弧「)」の数が等しくなる地点のことです。 例として、次の括弧文字列を考えてみましょう。 (()))( ()()() )) ) → 元の文字列は (()))(()()()))) この文字列を詳しく観察すると、インデックス0〜9の範囲に含まれる開き括弧は5個、インデックス9〜14の範囲に含まれる閉じ括弧も5個あります。したがって、インデックス9がこの文字列の