幾何学的な問題に対しては,常に浮動小数点型 double を用いることにする.整数座標に関する問題も浮動小数点で扱い,EPS を適当に設定することで対処することにする.
点はナイーブには座標の対であるが,加減算やスカラー倍が定義されていたほうが扱いやすい.そこで typedef complex<double> P; を用いることにする.
complex<number> の特徴は以下のとおり.
幾つかのアルゴリズムが operator < に依存するので,一度決めたものを使い続けることが重要である.
線分,点ともにそれが通る二点を用いて表現する.そのための型として vector<P> を継承したものを作る.これにより
などのメリットが得られる.
単純な(自己交差の無い)多角形は頂点のリスト typedef vector<P> G であらわす.ほとんどのアルゴリズムは多角形が反時計回りであることを仮定する.
円は中心と半径の対であらわす.
const double EPS = 1e-8; const double INF = 1e12; typedef complex<double> P; namespace std { bool operator < (const P& a, const P& b) { return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b); } } double cross(const P& a, const P& b) { return imag(conj(a)*b); } double dot(const P& a, const P& b) { return real(conj(a)*b); } struct L : public vector<P> { L(const P &a, const P &b) { push_back(a); push_back(b); } }; typedef vector<P> G; struct C { P p; double r; C(const P &p, double r) : p(p), r(r) { } };
Last Modified: 2007.11.12 14:19:22.