struct ANGLE {
double x, y;
ANGLE init(const double pi) {
x = cos(pi);
y = sin(pi);
return (*this);
}
double R() {
return sqrt(x*x+y*y);
}
double Asin() {
return x/R();
}
double Acos() {
return y/R();
}
double Atan() {
return x/y;
}
ANGLE operator + (ANGLE alpha) {
double newangle = atan(Atan())+atan(alpha.Atan());
return ANGLE{cos(newangle),sin(newangle)};
}
ANGLE operator - (ANGLE alpha) {
double newangle = atan(Atan())-atan(alpha.Atan());
return ANGLE{cos(newangle),sin(newangle)};
}
};
struct VECTOR {
double x, y;
VECTOR operator + (const VECTOR v) {
return VECTOR{x+v.x,y+v.y};
}
VECTOR operator - (const VECTOR v) {
return VECTOR{x-v.x,y-v.y};
}
double operator * (const VECTOR v) {
return x*v.x+y*v.y;
}
double operator ^ (const VECTOR v) {
return abs(x*v.y-v.x-y);
}
double length() {
return sqrt(x*x+y*y);
}
ANGLE Vangle() {
return ANGLE{x,y};
}
double Vsin(VECTOR v1,VECTOR v2) {
return (v1^v2)/(v1.length()*v2.length());
}
double Vcos(VECTOR v1,VECTOR v2) {
return (v1*v2)/(v1.length()*v2.length());
}
VECTOR operator * (const double gama) {
return VECTOR{x*gama,y*gama};
}
VECTOR reverse(const double alpha) {
return VECTOR{x*cos(alpha)-y*sin(alpha),y*cos(alpha)+x*sin(alpha)};
}
bool operator == (VECTOR v) {
double eps = 1e-9;
if(abs((*this)*v-length()*v.length()) <= eps)
return true;
else
return false;
}
bool operator | (VECTOR v) {
double eps = 1e-9;
if(abs((*this)*v) <= eps)
return true;
else
return false;
}
};
#include <stdio.h>
#include <iostream>
#include <cmath>
class VECTOR {
private :
double _x, _y, _z;
public :
VECTOR () {_x = _y = _z = 0;}
VECTOR (double __a,double __b,double __c) {_x = __a, _y = __b, _z = __c;}
VECTOR friend operator - (VECTOR);
VECTOR friend operator + (VECTOR,VECTOR);
VECTOR friend operator - (VECTOR,VECTOR);
double friend operator * (VECTOR,VECTOR);
VECTOR friend operator ^ (VECTOR,VECTOR);
VECTOR friend operator * (VECTOR,double);
VECTOR friend operator / (VECTOR,double);
inline double TD_cross(VECTOR _sub,VECTOR _ob) {
return _ob._y*_sub._x-_ob._x*_sub._y;
}
double x() {return _x;}
double y() {return _y;}
double z() {return _z;}
double x(double _newx) {return _x = _newx;}
double y(double _newy) {return _y = _newy;}
double z(double _newz) {return _z = _newz;}
VECTOR friend operator - (VECTOR _ob) {
return VECTOR{-_ob.x(),-_ob.y(),-_ob.z()};
}
VECTOR friend operator + (VECTOR _sub,VECTOR _ob) {
return VECTOR{_sub.x()+_ob.x(),_sub.y()+_ob.y(),_sub.z()+_ob.z()};
}
VECTOR friend operator - (VECTOR _sub,VECTOR _ob) {
return VECTOR{_sub.x()-_ob.x(),_sub.y()-_ob.y(),_sub.z()-_ob.z()};
}
VECTOR friend operator * (VECTOR _sub,double _ob) {
return VECTOR{_sub.x()*_ob,_sub.y()*_ob,_sub.z()*_ob};
}
VECTOR friend operator / (VECTOR _sub,double _ob) {
if(_ob == 0) std :: clog << "error (in class VECTOR) :: unexcepted 0.0(double) in operator / (VECTOR,double)." << std :: endl;
return VECTOR{_sub.x()/_ob,_sub.y()/_ob,_sub.z()/_ob};
}
double friend operator * (VECTOR _sub,VECTOR _ob) {
return _sub._x*_ob._x+_sub._y*_ob._y+_sub._z*_ob._z;
}
VECTOR friend operator ^ (VECTOR _sub,VECTOR _ob) {
return VECTOR{_ob._z*_sub._y-_sub._z*_ob._y,_ob._x*_sub._z-_sub._x*_ob._z,_ob._y*_sub._x-_sub._y*_ob._x};
}
bool clockwise(VECTOR _sub,VECTOR _ob) {
return TD_cross(_ob,_sub) > 0;
}
bool collinear(VECTOR _sub,VECTOR _ob) {
return TD_cross(_ob,_sub) == 0;
}
bool vertical(VECTOR _sub,VECTOR _ob) {
return _sub*_ob == 0;
}
double length() {
return sqrt(_x*_x+_y*_y+_z*_z);
}
double Vcos(VECTOR _sub,VECTOR _ob) {
return fabs(_sub*_ob)/_sub.length()/_ob.length();
}
double Vsin(VECTOR _sub,VECTOR _ob) {
return fabs(TD_cross(_sub,_ob))/_sub.length()/_ob.length();
}
double Vtan(VECTOR _sub,VECTOR _ob) {
return fabs(TD_cross(_sub,_ob))/fabs(_sub*_ob);
}
double Vangle(VECTOR _sub,VECTOR _ob) {
return acos(Vcos(_sub,_ob));
}
double Varea(VECTOR _sub,VECTOR _ob) {
return fabs(TD_cross(_sub,_ob));
}
};
signed main() {
return 0;
}