计算几何中的数据表示:
为了规范代码的格式,整理一下数据的表示格式:
本文中都用a(x1,y1),b(x2,y2)和c表示向量。
向量加减法:
设二维向量a(x1,y1),向量b(x2,y2).向量c。
向量的加法:c=a+b=(x1+x2,y1+y2);
因为向量是矢量,带有方向,因此:
向量的减法:c=a-b=-(b-a)=(x1-x2,y1-y2);
向量的点积:向量的点积是一个实数。
a*b=|a|*|b|*cos(A),这里A是a和b的夹角。
如果已知向量的点积,计算夹角A=arccos(a*b/(|a|*|b|))
c=a*b=(x1*x2,y1*y2);
向量的叉积:向量的叉积是一个向量。
向量叉积的长度为:|ab|=x1*y2-x2*y1;
方向为:垂直于向量a和向量b,并(a,b,ab)为右手系。
性质:ab=-(ba),a(-b)=-(ab);
叉积的一个重要性质是可以通过它的符号判断两向量之间的顺逆时针关系:
ab>0,a在b的顺时针方向。
ab<0,a在b的逆时针方向。
ab=0,a和b共线,但也可能反方向||同方向。
Code:
struct Point{//点的表示
double x,y;
Point(double _x=0,double _y=0){
x=_x;y=_y;
}
friend Point operator + (const Point &a,const Point &b){
return Point(a.x+b.x,a.y+b.y);
}
friend Point operator - (const Point &a,const Point &b){
return Point(a.x-b.x,a.y-b.y);
}
};
struct V{//向量的表示
Point start,end;
V(Point _start=Point(0,0),Point _end=Point(0,0)){
start=_start;end=_end;
}
};
struct Triangle{
Point A,B,C;
};
V Add(V a,V b){
return V(a.start+b.start,a.end+b.end);
}
V Sub(V a,V b){
return V(a.start-b.start,a.end-b.end);
}
double DotMul(V a,V b){
a.end=a.end-a.start;b.end=b.end-b.start;
return a.end.x*b.end.x+a.end.y*b.end.y;
}
double CroMul(V a,V b){
a.end=a.end-a.start;b.end=b.end-b.start;
return a.end.x*b.end.y-b.end.x*a.end.y;
}
Update:符号重载进行叉乘运算。
struct Point{
double x,y;
Point(double _x=0,double _y=0){
x=_x;y=_y;
}
friend Point operator + (const Point &a,const Point &b){
return Point(a.x+b.x,a.y+b.y);
}
friend Point operator - (const Point &a,const Point &b){
return Point(a.x-b.x,a.y-b.y);
}
friend double operator ^ (Point a,Point b){//进行^符号的重载,更为清晰。
return a.x*b.y-a.y*b.x;
}
}Dots[MAXN];