向量
向量旋转
- 已知一个向量 p=(x,y),则其逆时针旋转A度后的向量
- p‘=(xcosA-ysinA,xsinA+ycosA)
叉积和点积
一.什么是叉积和点积
-
向量的叉积和点积,用来判断几何中的点线位置关系,且频繁出现,非常重要
-
叉积 = a x b = x1y2-x2y1
-
点积 = a x b = x1x2+y1y2
二.如何使用叉积和点积
使用叉积
1.判断两个向量的位置关系
- 令p1=(x1,y1),p2=(x2,y2)
- 若叉积大于0,则p1逆时针旋转到p2
- 若叉积等于0,则O,p1,p2三点共线
- 若叉积小于0,则p1顺时针选择到p2
double cross(point p0,point p1,point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
2.计算三角形面积
- 叉积等于该三角形面积的两倍,等于p1,p2向量构成的平行四边形面积
double area(point p0,point p1,point p2){
return fabs((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x));
}
3.计算多面体的面积
- 原点向多面体每条边的两端点引两个向量,其向量叉积的和(不加绝对值)就是该多面体的面积。
- 给定n个点,且点的给出要是逆时针,即点的极角是从小到大的。
double cross(point p0,point p1,point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double area(){
point p0={
0,0};
double ans=0;
for(int i=1;i<n;i++)ans+=cross(p0,p[i],p[i+1]);
ans+=cross(p0,p[n],p[1]);
return ans/2;
}
使用点积
1.判断两条之间的位置关系
- 令p1=(x1,y1),p2=(x2,y2)
- 若点积大于0,则p2在垂直于p1的法线右侧
- 若点积等于0,则p2垂直于p1
- 若点积小于0,则p2在垂直于p1的法线左侧
pick定理
- pick定理:给定顶点均为整点的简单多边形,皮克定理说明了其面积A和内部格点数目 i,边上给点数目 b 的关系
- A = i + b 2 \frac{b}{2} 2b - 1