计算几何小模板

来源:互联网 发布:衬衣品牌 知乎 编辑:程序博客网 时间:2024/05/16 23:39

RT

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#include<map>using namespace std;#define Vector Pointint t;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} } ;void Wa(){ cout<<"Wrong!!!"<<endl; system("pause"); }double dcmp(double x){ if(abs(x)<eps)return 0; return x; }int Getsign(double x){ if(!dcmp(x))return 0; if(x<0)return -1; return 1; }bool operator <(Point u, Point v){ return u.x<v.x||(v.x==u.x&&u.y<v.y); }bool operator ==(Point u, Point v){ return u.x==v.x&&u.y==v.y; }bool operator >(Point u, Point v){ return !(u==v||u<v); }Vector operator -(Point u, Point v){ return Point(u.x-v.x,u.y-v.y); }Vector operator +(Vector u, Vector v){ return Vector(u.x+v.x,u.y+v.y); }double operator *(Vector u, Vector v){ return u.x*v.x+u.y*v.y; }Vector operator *(Vector u, double k){ return Vector(u.x*k, u.y*k); }Vector operator /(Vector u, double k){ if(!k)Wa(); return Vector(u.x/k, u.y/k); }double Cross(Vector u, Vector v){ return u.x*v.y-u.y*v.x; }double AreaTri(Vector u, Vector v){ return Cross(u,v); }Vector Rotate(Vector u, double rad){ return Vector(u.x*cos(rad)-u.y*sin(rad), u.x*sin(rad)+u.y*cos(rad)); }double Length(Vector u){ return sprt(u.x*u.x+u.y*u.y); }double Angle(Vector u, Vector v){ if(!(Length(u)&&Length(v)))Wa(); return acos(u*v/Length(u)/Length(v)); }Point GetInt(Point a, Vector b, Point c, Vector d){ Vector tem=a-c;  double t=Cross(d,tem)/Cross(b,d); return a+b*t; }bool Onseg(Point a,Point b,Point c){ return dcmp((a-c)*(b-c))==0&&dcmp(Cross(a-c,b-c))<0; }bool IntLine(Point a, Point b, Point c, Point d){double c1=Cross(b-a,c-a),c2=Cross(b-a,d-a);double c3=Cross(c-d,a-d),c4=Cross(c-d,b-d);return Getsign(c1)*Getsign(c2)<0 &&Getsign(c3)*Getsign(c4)<0;}


0 0
原创粉丝点击