叉积(向量积)定义:
1、a×b或a∧b,结果为标量;
2、向量积|c|=|a×b|=|a||b|sin<a,b>,即c的长度在数值上等于以a,b,夹角为θ组成的平行四边形的面积;
3、a=(x1,y1),b=(x2,y2),则a×b=x1y2-y1x2;
4、a×b小于0,向量a小于180°逆时针旋转到向量b;a×b大于0,向量a小于180°顺时针旋转到向量b;a×b等于0,向量a平行与向量b;
引用场景1:
OpenCV中contourArea轮廓面积算法时,假设轮廓点(A、B、C)按顺时针排序,O为原点,OA×OB为对应平行四边形的面积,一半即为三角形OAB的面积(绿色区域)
则有ABC的面积=OA×OB×0.5+OB×OC×0.5+OC×OA×0.5,其中OC×OA方向与其他相反;
引用场景2:
对一组任何分布的点集采用冒泡法进行顺时针排序时,需要对两两向量方向进行确定,如OA旋转到OB是顺时针还是逆时针的。
bool IsAnticlockwise(Point O, Point a, Point b)
{
//如果oa顺时针旋转到ob的角度小于180°,返回false,否则返回true
if (a.x >= 0 && b.x < 0)
return true;
if (a.x == 0 && b.x == 0)
return a.y > b.y;
//向量OA和向量OB的叉积
int det = (a.x - O.x) * (b.y - O.y) - (b.x - O.x) * (a.y - O.y);
if (det < 0)
return true;
if (det > 0)
return false;
//向量OA和向量OB共线,以距离判断大小
int d1 = (a.x - O.x) * (a.x - O.x) + (a.y - O.y) * (a.y - O.y);
int d2 = (b.x - O.x) * (b.x - O.y) + (b.y - O.y) * (b.y - O.y);
return d1 > d2;
}
引用场景3:
通过两向量的叉积正负判断线段是否相交;
https://blog.csdn.net/li1615882553/article/details/80372202
其他:
注意区分点积(向乘),结果为向量,v1.v2=|v1|*|v2|*cosθ