任意两个向量x=(a1,b1),y=(a2,b2);
点积x·y=a1×a2+b1×b2=|x|·|y|·cos(θ)
叉积|x×y|=a1×b2-a2×b1=|x|·|y|·sinθ
用点表示叉积就是
bool judge(point a,point b,point c)
{
if((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)==0)
return true;
else return false;
}
点积
点积的集合意义:我们以向量 a 向向量 b 做垂线,则 | a | * cos(a,b)为 a 在向量 b 上的投影,即点积是一个向量在另一个向量上的投影乘以另一个向量。且满足交换律
应用:可以根据集合意义求两向量的夹角,cos(a,b) =( 向量a * 向量b ) / (| a | * | b |) = x1*x2 + y1*y2 / (| a | * | b |)
叉积
叉积的结果也是一个向量,是垂直于向量a,b所形成的平面,如果看成三维坐标的话是在 z 轴上,结果为 x1*y2-x2*y1,上面结果是它的模。
方向判定:右手定则,(右手半握,大拇指垂直向上,四指右向量a握向b,大拇指的方向就是叉积的方向)
叉积的集合意义:
1:其结果是a和b为相邻边形成平行四边形的面积。
2:结果有正有负,有sin(a,b)可知和其夹角有关,夹角大于180°为负值。
3:叉积不满足交换律
性质
***叉积德结果是以x和y为相邻边形成的平行四边形的面积
***结果有正有负,意义不同,夹角大于180为负值
***叉积不满足交换律,也就是说x×y和 y×x的结果是不同的
应用
***通过接货的政府判断两矢量之间的顺逆时针关系
若|x×y|>0表示x在y的顺时针方向
若|x×y|<0表示x在y的逆时针方向
若|x×y|>0表示x和y共线,但不确定方向是否相同
***设向量t=(x,y)关于原点逆时针旋转θ后的坐标为(x',y‘),那么 x '=xcosθ+ysinθ
y'=xsinθ+ycosθ;
*****
计算机对出发计算有一定的精度,在某些精度要求较高的情况下,为保持正确性应该尽量避免除法,利用叉积就是避免除法的方法之一。
常量
***
关于浮点数精度的问题
***两个浮点数不能直接比较大小,比如判断一个浮点数是否为0
**if(abs(ans)<EPS)即表示if(ans==0)浮点数知否为0
**if(fabs(a-b)<EPS)即表示if(a==b)浮点数是否相等
**if(a-b<EPS)即表示if(a<b)浮点数比较大小
***另外一种处理浮点数的方法:在不溢出整数范围的情况下,可以通过乘以10ⁿ来转换为整数运算
****写计算几何的题目时务必检查每一个变量时double还是int
实际问题
1.判断给定点p是否在线段AB上
**|AP×BP|=0且min(x1,x2)<=xp<=max(x1,x2);
min(y1,y2)<=yp<=max(x1,x2);
总结:点在线段上(叉积=0)
点在线段延长线上(叉积=0)
点在线段顺时针方向(叉积>0)
点在线段逆时针方向(叉积<0)
2.判断一个点是否位于三角形ABC中
**可以根据面积法判断
**利用叉积判断
AP在AC顺时针方向
CP在CB顺时针方向
BP在BA顺时针方向
即三者叉积都是大于0
当为逆时针方向时三者叉积都小于0
*****升级:可以利用叉积德正负号来判断一个点是否在凸多边形的内部
心心
外心:三遍中垂线的交点,外接圆的圆心,到三角形的三个顶点的距离相等
内心:角平分线的交点,到三角形三边的距离相等
垂心:三条高线的交点
重心:三条中线的交点时到三角形三个顶点距离的平方和最小的点,三角形内到三边距离之积最大 的点
旁心:三角形一条内角平分线与其他两个角的外角平分线的交点,旁心到三角形一边及其他两边延 长线的距离相等
***三角形的面积用海伦公式计算
3.判断一个多边形是否为凸多边形
**对于凸多边形来说,任意相邻的三个点组成的两向量的叉积,符号一致
4.极角的顺序
5.凸包
Graham扫描法
该算法的时间复杂度大约是O(nlog(n))
所需的知识点:极角排序,栈的使用和叉积的应用