写在前面
向量在计算几何中是最常用的结构,也是包含运算较多的结构
向量运算的实现
struct point{
double x,y;//定义构造函数会对后面的工作提供极大的便利
point(){}
point(double _x,double _y)x:(_x),y(_y){} //采用运算符重载的方式实现向量的运算
/*
或者这样写:
point(double a=0,double b=0){
x=a,y=b;
}
*/
point operator+(point a){ //向量加法
return point(x+a.x,y+a.y);
}
point operator-(point a){ //向量减法
return point(x-a.x,y-a.y);
}
double operator*(point a){ //向量叉积
return x*a.y-a.x*y;
}
double operator^(point a){ //向量点积
return x*a.x+y*a.y;
}
point operator*(double a){ //向量乘以实数
return point(a*x,a*y);
}
double len2(){ //向量模的平方
return x*x+y*y;
}
};
1.一些基本概念:
1)关于一条线段
一条线段如下图所示(在二维平面上):
那么很简单的是,我们可以直接用AB来表示这条线段,那么我们还可以用点+向量的形式来表示这条线段,如上图AB就可以表示为A+=B,或者也可以表示为B+=A,都是可以的。同样,对于AB上任意一点C,都满足下面这个式子:
如果存在任意C∈AB,都存在(存在)p∈[0,1],使得C=(1-p)A+pB。(p指AC:AB的比例)
证明见下图:
我们过C作CDOB交OA于D,作CEOA交OB于E,首先因为有DCOB,所以ADCAOB,所以有AD:DO=AC:BC=p:1-p,所以OD=(1-p)OA,同理OE=pOB,因为向量的加减满足平行四边形法则(见下方4.2),所以有=,最后代换一下即可得到上方的式子。
2.关于一条直线
直线一般就是利用直线上的两个点来表示,方法同上。
3.关于一个多边形
最主要的还是一个存储问题,通常我们会按顺时针或逆时针的顺序存储多边形的顶点,或者存边及其起点。
4.关于向量
几何向量就是指线性空间里既有大小又有方向的量(没错就是矢量)
1)关于向量的表示
向量其实可以理解为一条带箭头的线段,箭头代表方向,线段长度代表大小,如果给定起点A和终点B,那么这个向量就可以表示为