#include <iostream>
#include <cmath>
using namespace std;
#define eps 0.000001
#define neps (-1*eps)
#define abs(x) ((x)<0 ? (-1*(x)) : (x))
class Vector;
class Point {
private :
double _x;
double _y;
public :
Point ( double x = 0 , double y = 0 ) : _x( x) ,
_y( y) { }
friend class Vector;
} ;
class Vector {
private :
Point _a;
Point _b;
double matrix_det ( const Point & A, const Point & B, const Point & C) const {
return ( A._x * B._y + B._x * C._y + C._x * A._y - C._x * B._y - A._x * C._y - B._x * A._y) ;
}
public :
Vector ( double a_x = 0 , double a_y = 0 , double b_x = 0 , double b_y = 0 ) : _a( Point( a_x, a_y) ) ,
_b( Point( b_x, b_y) ) { }
Vector ( const Point & A, const Point & B) : _a( A) ,
_b( B) { }
double length ( ) const {
return sqrt ( pow ( _a._x - _b._x, 2.0 ) + pow ( _a._y - _b._y, 2.0 ) ) ;
}
bool belong ( const Point & A) const {
if ( abs ( Vector( A, _a) .length ( ) + Vector( A, _b) .length ( ) - this- > length( ) ) <= eps)
return true ;
return false ;
}
bool intersection ( const Vector & V) const {
double x = ( ( this- > _b._x- this- > _a._x) * ( V._b._x* V._a._y- V._b._y* V._a._x) - ( V._b._x- V._a._x) * ( this- > _b._x* this- > _a._y- this- > _b._y* this- > _a._x) ) / ( ( this- > _b._y- this- > _a._y) * ( V._b._x- V._a._x) - ( V._b._y- V._a._y) * ( this- > _b._x- this- > _a._x) ) ;
double y = ( ( V._b._y- V._a._y) * ( this- > _b._x* this- > _a._y- this- > _b._y* this- > _a._x) - ( this- > _b._y- this- > _a._y) * ( V._b._x* V._a._y- V._b._y* V._a._x) ) / ( ( V._b._y- V._a._y) * ( this- > _b._x- this- > _a._x) - ( this- > _b._y- this- > _a._y) * ( V._b._x- V._a._x) ) ;
if ( this- > belong( Point( x, y) ) && V.belong ( Point( x, y) ) )
return true ;
else return false ;
}
} ;
int main( ) {
Vector T2 ( 0 , 0 , 1 , 1 ) ;
Vector V ( 1 , 1 , 5 , 5 ) ;
cout << T2.intersection ( V) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGVwcyAwLjAwMDAwMQojZGVmaW5lIG5lcHMgKC0xKmVwcykKI2RlZmluZSBhYnMoeCkgKCh4KTwwID8gKC0xKih4KSkgOiAoeCkpCmNsYXNzIFZlY3RvcjsKCmNsYXNzIFBvaW50IHsKcHJpdmF0ZToKCWRvdWJsZSBfeDsKCWRvdWJsZSBfeTsKcHVibGljOgoJUG9pbnQgKGRvdWJsZSB4ID0gMCwgZG91YmxlIHkgPSAwKSA6IF94KHgpLAoJCV95KHkpIHt9CglmcmllbmQgY2xhc3MgVmVjdG9yOwp9OwoKY2xhc3MgVmVjdG9yIHsKcHJpdmF0ZToKCVBvaW50IF9hOwoJUG9pbnQgX2I7Cglkb3VibGUgbWF0cml4X2RldCAoY29uc3QgUG9pbnQgJkEsIGNvbnN0IFBvaW50ICZCLCBjb25zdCBQb2ludCAmQykgY29uc3QgewoJCXJldHVybiAoQS5feCAqIEIuX3kgKyBCLl94ICogQy5feSArIEMuX3ggKiBBLl95IC0gQy5feCAqIEIuX3kgLSBBLl94ICogQy5feSAtIEIuX3ggKiBBLl95KTsKCX0KCnB1YmxpYzoKCVZlY3RvciAoZG91YmxlIGFfeCA9IDAsIGRvdWJsZSBhX3kgPSAwLCBkb3VibGUgYl94ID0gMCwgZG91YmxlIGJfeSA9IDApIDogX2EoUG9pbnQoYV94LCBhX3kpKSwKCQlfYihQb2ludChiX3gsIGJfeSkpIHt9CglWZWN0b3IgKGNvbnN0IFBvaW50ICZBLCBjb25zdCBQb2ludCAmQikgOiBfYShBKSwKCQlfYihCKSB7fQoJCQoJZG91YmxlIGxlbmd0aCAoKSBjb25zdCB7CgkJcmV0dXJuIHNxcnQgKHBvdyAoX2EuX3ggLSBfYi5feCwgMi4wKSArIHBvdyAoX2EuX3kgLSBfYi5feSwgMi4wKSk7Cgl9CgkKCWJvb2wgYmVsb25nIChjb25zdCBQb2ludCAmQSkgY29uc3QgewoJCWlmIChhYnMoVmVjdG9yKEEsIF9hKS5sZW5ndGgoKSArIFZlY3RvcihBLCBfYikubGVuZ3RoKCkgLSB0aGlzLT5sZW5ndGgoKSkgPD0gZXBzKQoJCQlyZXR1cm4gdHJ1ZTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJYm9vbCBpbnRlcnNlY3Rpb24gKGNvbnN0IFZlY3RvciAmVikgY29uc3QgewoJCWRvdWJsZSB4ID0gKCh0aGlzLT5fYi5feC10aGlzLT5fYS5feCkqKFYuX2IuX3gqVi5fYS5feS1WLl9iLl95KlYuX2EuX3gpLShWLl9iLl94LVYuX2EuX3gpKih0aGlzLT5fYi5feCp0aGlzLT5fYS5feS10aGlzLT5fYi5feSp0aGlzLT5fYS5feCkpLygodGhpcy0+X2IuX3ktdGhpcy0+X2EuX3kpKihWLl9iLl94LVYuX2EuX3gpLShWLl9iLl95LVYuX2EuX3kpKih0aGlzLT5fYi5feC10aGlzLT5fYS5feCkpOwoJCWRvdWJsZSB5ID0gKChWLl9iLl95LVYuX2EuX3kpKih0aGlzLT5fYi5feCp0aGlzLT5fYS5feS10aGlzLT5fYi5feSp0aGlzLT5fYS5feCktKHRoaXMtPl9iLl95LXRoaXMtPl9hLl95KSooVi5fYi5feCpWLl9hLl95LVYuX2IuX3kqVi5fYS5feCkpLygoVi5fYi5feS1WLl9hLl95KSoodGhpcy0+X2IuX3gtdGhpcy0+X2EuX3gpLSh0aGlzLT5fYi5feS10aGlzLT5fYS5feSkqKFYuX2IuX3gtVi5fYS5feCkpOwoJCWlmICh0aGlzLT5iZWxvbmcoUG9pbnQoeCwgeSkpICYmIFYuYmVsb25nKFBvaW50KHgsIHkpKSkKCQkJcmV0dXJuIHRydWU7CgkJZWxzZSByZXR1cm4gZmFsc2U7Cgl9Cn07CgppbnQgbWFpbigpIHsKCVZlY3RvciBUMiAoMCwgMCwgMSwgMSk7CglWZWN0b3IgViAoMSwgMSwgNSwgNSk7Cgljb3V0PDxUMi5pbnRlcnNlY3Rpb24oVik7CglyZXR1cm4gMDsKfQ==