AOJ - Problem 0021 : Parallelism
4つの点A, B, C, Dがあり、直線ABとCDが平行か判定する問題です。
幾何問題の中では初歩的な問題です。
幾何問題のベクトル演算にかんする解説がACM/ICPC国内予選突破の手引きにあり、分かりやすいです。
幾何の基本的なベクトル演算はこのサイトを参考にコーディングするようにしています。
#include <complex> #include <iostream> using namespace std; typedef complex<double> P; // 許容する誤差ε #define EPS (1e-10) // 2つのスカラーが等しいかどうか #define EQ(a,b) (abs((a)-(b)) < EPS) // 外積 (cross product) : a×b = |a||b|sinΘ double cross(P a, P b) { return (a.real() * b.imag() - a.imag() * b.real()); } // 2直線の平行判定 : a//b <=> cross(a, b) = 0 int is_parallel(P a1, P a2, P b1, P b2) { return EQ( cross(a1-a2, b1-b2), 0.0 ); } int main(){ int n; double x1,x2,x3,x4,y1,y2,y3,y4; cin >> n; for(int i=0 ; i<n ; i++){ cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4; P a(x1,y1), b(x2,y2), c(x3,y3), d(x4,y4); if( is_parallel(a,b,c,d) ){ cout << "YES" << endl; }else{ cout << "NO" << endl; } } }