08 計算幾何
阿新 • • 發佈:2020-08-08
點/向量
const double eps=1e-8;
struct Point{
double x,y;
Point(){};
Point(double x,double y): x(x),y(y){};
Point operator+(Point m){//向量加法
Point t(x+m.x,y+m.y);
return t;
}
Point operator*(double m){//數乘
Point t(x*m,y*m);
return t;
}
bool operator ==(Point m){//判斷相等
if(fabs(x-m.x)+fabs(y-m.y)<=eps)
return 1;
else return 0;
}
double len(){//向量的模
return sqrt(x*x+y*y);
}
double len2(){//模平方
return len()*len();
}
double ang(){//極角,範圍(-pi,pi]
return atan2(y,x);
}
void one(double l=1){//歸一化,預設為1
x=l*x/len(),y=l*y/len();
}
double dis(Point m){//兩點之間的距離
return sqrt((x-m.x)*(x-m.x)+(y-m.y)*(y-m.y));
}
double operator*(Point m){//向量點乘
return x*m.x+y*m.y;
}
double operator^(Point m){//向量叉乘
return x*m.y-y*m.x;
}
Point rotate(double ang){//順時針旋轉
Point t(x*cos(ang)-y*sin(ang),x*sin(ang)+y*cos(ang));
return t;
}
};
double sin(Point v1,Point v2){//向量夾角的正弦
return (v1^v2)/(v1.len()*v2.len());
}
double cos(Point v1,Point v2){//向量夾角的餘弦
return v1*v2/(v1.len()*v2.len());
}
double ang(Point v1,Point v2){//兩向量的夾角
return atan2(v1^v2,v1*v2);
}
直線
1 typedef Point Vec;
2 struct Line{//點向式直線
3 Vec dir;//方向向量中x為正值
4 Point pnt;
5 Line(){}
6 Line(Vec _dir,Point _pnt):dir(_dir),pnt(_pnt){}
7 int relation(Point p){
8 Vec v=dir,u=p-dir;
9 if((v^u)<eps){
10 return -1;
11 }else if((v^u)>eps){
12 return 1;
13 }else return 0;
14 }
15 double pointdis(Point p){
16 return fabs(p^dir)/dir.len();
17 }
18 Point touying(Point p){
19 Point t,u=p-dir,v=dir;
20 t=dir*(fabs(v^u)/v.len2());
21 return t=t+pnt;
22 }
23 bool operator||(Line s){//平行且不相等
24 if(dir.x*s.dir.y==dir.y*s.dir.x){
25 Vec t=s.pnt-pnt;
26 if(dir.x*t.y!=dir.y*t.x)
27 return 1;
28 }
29 return 0;
30 }
31 bool operator|(Line s){//只判斷方向
32 if(dir.x*s.dir.y==dir.y*s.dir.x){
33 return 1;
34 }
35 return 0;
36 }
37 };
先就寫這兩個吧,感覺太多的用不到。等整理板子的時候再補充吧。