先介绍向量外积:向量ab×向量ac=|ab|*|ac|*sin<ab,ac>
显然结果的绝对值为△abc面积的2倍,因此利用向量外积可以求任意多边形的面积;
向量的外积代码:
double det(int a,int b,int c)
{
return (x[b]-x[a])*(y[c]-y[a])-(x[c]-x[a])*(y[b]-y[a]);
}
1)结果=0,说明三点共线;
2)结果>0,说明向量ac在向量ab的逆时针方向;
3)结果<0,说明向量ac在向量ab的顺时针方向;
由1)可以获知点在直线上,由2)3)的结果可以引出两个线段是否相交;
线段相交:
线段ab和线段cd相交的充分必要条件为a,b在线段cd两侧,c,d在线段ab两侧;
因此,(向量ac×向量ad)和(向量bc×向量bd)各自的旋转方向的必然相反;
由此得出线段相交的两大条件:
1)(向量ac×向量ad)×(向量bc×向量bd)< 0 ;
2)(向量ca×向量cb)×(向量da×向量db)< 0 ;
求线段交点的话,联立方程即可;
然后,向量内积:向量ab*向量ac=|ab|*|ac|*cos<ab,ac>
向量的内积代码:
double dot(int a,int b,int c)
{
return (x[b]-x[a])*(x[c]-x[a])+(y[b]-y[a])*(y[c]-y[a]);
}