【杂项】计算几何杂项

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;
}
posted @ 2022-06-30 21:19  bikuhiku  阅读(26)  评论(0编辑  收藏  举报