_p1と_p2,_p3と_p4によって作られる線分の交点を求める
typedef double value; typedef complex<value> point; value cross( point _a, point _b ) { return _a.real() * _b.imag() - _a.imag() * _b.real(); } value dot( point _a, point _b ) { return _a.real() * _b.real() + _a.imag() * _b.imag(); } bool OnToLine( point _p, point _p1, point _p2 ) { point a = _p1 - _p; point b = _p2 - _p; if( cross(a,b) != 0 ) return false; if( dot(a,b) > 0 ) return false; return true; } struct Line { value A,B,C; }; Line CreateLine( point _a, point _b ) { Line l; point t = _a - _b; l.A = - t.imag(); l.B = t.real(); l.C = - cross(_a,_b); return l; } bool CollisionLine( point _p1, point _p2, point _p3, point _p4, value & _outX, value & _outY ) { Line l1 = CreateLine(_p1,_p2); Line l2 = CreateLine(_p3,_p4); value d = l2.B * l1.A - l1.B * l2.A; if( d == 0 ) return false; _outX = ( l1.B * l2.C - l2.B * l1.C ) / d; _outY = ( l2.A * l1.C - l1.A * l2.C ) / d; return OnToLine( point(_outX,_outY), _p1, _p2 ); }