向量在计算几何中是最常用的结构,也是包含运算较多的结构
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;
}
};
一条线段如下图所示(在二维平面上):
那么很简单的是,我们可以直接用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,作CE
OA交OB于E,首先因为有DC
OB,所以
ADC
AOB,所以有AD:DO=AC:BC=p:1-p,所以OD=(1-p)OA,同理OE=pOB,因为向量的加减满足平行四边形法则(见下方4.2),所以有
=
,最后代换一下即可得到上方的式子。
直线一般就是利用直线上的两个点来表示,方法同上。
最主要的还是一个存储问题,通常我们会按顺时针或逆时针的顺序存储多边形的顶点,或者存边及其起点。
几何向量就是指线性空间里既有大小又有方向的量(没错就是矢量)
向量其实可以理解为一条带箭头的线段,箭头代表方向,线段长度代表大小,如果给定起点A和终点B,那么这个向量就可以表示为,同样也可以用小写字母
的形式来表示。
在平面直角坐标系上,同样也可以用数对的形式来表示:A(x1,y1),B(x2,y2)→=(x2-x1,y2-y1)。
设,那么有向线段AB的长度叫做向量a的模,记作|a|,大小就是两点的欧几里得距离。
向量的运算遵循平行四边形法则(现在不懂没关系,高中物理会讲,数学也会讲)
加减法就非常形象,一张图搞定:
,
,
我们可以这样理解:因为OAAC,那么向量OA与OB的和就可以视为O先移动到A,再从A移动到C,所以向量OA与OB的和就是OC。其他两个式子同理。
同样可以用坐标表示出来:
加法:a+b=(x1+x2,y1+y2),减法:a-b=(x1-x2,y1-y2)。
然后是向量去乘以(或除以)一个非零数,也很明显,就是向量的放缩,如果为负数顺带反向。图示:
向量OA乘以一个(0,1)之间的数可得到OA',乘以一个(1,)的数可得到OA'',乘以一个负数可得到OA'''。
1.向量之间的夹角。
对于两个非零向量,任取一点O,作
,
,那么
就叫向量a、b的夹角,记作<
>
2.向量的点积与叉积
首先需要点预备知识:和角公式(如果不会请自行百度)
a=(x1,y1),b=(x2,y2)的点积用表示,
。它的结果是一个标量(只有大小没有方向) .它的几何意义是向量a在向量b方向上的投影与向量b的模的乘积,即
。
大概就是这个意思:
OC就是OB在OA方向上的投影,最后的结果就是OCOA。
小小证明一下:
由平面内两点距离公式我们可以得到,
令OC为OB在OA上的投影,,
可得x1=OB*cos,y1=OB*sin
,x2=OA*cos
,y2=OA*sin
,所以x1x2+y1y2=OA*OB*(
)
由和角公式:,可得x1x2+y1y2=OA*OB*
=向量OC的模*向量OA的模。证毕。
那么利用点积我们可以干什么呢?判垂直!显然,如果向量OBOA,那么向量OB在向量OA上的投影的模为0,那么二者的点积就为0。
然后是向量的叉积。
三维叉积:两个向量a=(x1,y1,z1),b=(x2,y2,z2)的叉积的结果是一个向量c,记作。
根据叉积的计算式,可得c的模长即为以a,b为邻边所作的平行四边形的面积,c的方向遵循右手定则(右手除大拇指外四指与a 平行,方向与a 一致,大拇指与a 垂直,然后四指转过一个小于的角到达b ,此时大拇指的方向就是c 的方向)
那么二维叉积呢?我们可以将其视作z=0的时候的情况,所以叉积结果为(0,0,)。所以我们定义二维叉积为:
,其几何意义为:其结果大小等于以a,b为邻边所作平行四边形的有向面积(这个就不需要证了吧,手推一下就出来了),即
,而根据叉积的结果,我们能判断a,b的方向。如下图:
由此我们也可以推出,
a,b共线。
3.向量的旋转
对于向量=(x1,y1),如果我们将其逆时针旋转
,那么旋转后的向量
的坐标怎么表示呢?见下图:
我们令向量OA的模长为L,那么x1=,y1=
,x2=
,y2=
。
因为,所以x2=
,展开可得
,y2同理。
如果你还在想海伦公式这种东西的话,emmm,你没救了。
我们可以利用叉积直接得到二倍三角形的面积=||=|
|=|
|。
直接看向量PA的大小+向量PB的大小(均取绝对值)是否等于向量AB的大小。
直接看的结果是否为0即可。
利用叉积判断,>0则逆时针拐弯。
利用点积判断直角,
锐角,
钝角。
分两种情况讨论:1.中有一个为钝角,则最短距离为min(|PA|,|PB|)
判断 B A, 是否在CD两边,以及 D C, 是否在 AB 两边,还要注意共线的特殊情况:若 AB ,CD不共线,则判断:且
,否则判断AB是否至少一个点在线段CD上,类似下图:
1.代数方法:就是初中教的两解析式求解,非常。。。。。好想,但信息学基本不用。。。
如图,三角形ACD的面积即为S1,三角形BCD的面积即为S2,那么PA:AB=S1:S1+S2(共边定理),然后就可以得到上面那个式子了。
这里贴道小例题:POJ2318 TOYS https://blog.csdn.net/g21glf/article/details/80907277
大概就是这些了吧