叉乘
点积
代数定义:设二维空间内有两个向量a 和 b,定义它们的数量积(又叫内积、点积)为以下实数:
几何定义:设二维空间内有两个向量a和 b ,它们的夹角为θ,则内积定义为以下实数:
通常我们在程序中使用点积来判断两个向量夹角是在0~90°还是90°~180°。即Unity的API中,vector3.Dot(p1,p2)>=0表示两个向量夹角是在0~90°。
叉乘
与点积不同,它的结果是一个向量。向量积可以被定义为:
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。)
注意:由于Unity是左手坐标系,所以向量叉乘要使用左手定则来判断。(其实就是按照上面规则使用左手来判断)在项目中,我们通常可以用两向量叉乘所得的新向量的方向来判断两向量的夹角是凹角还是凸角。在闭合区间相关计算上会经常用到。
unity中的判断示例代码如下:
//是否是凸角
public static bool IsConvexAngle(Vector2 p1,Vector2 p2)//逆时针方向的连续三个顶点
{
Vector3 p3 = new Vector3(p1.x, 0, p1.y);
Vector3 p4 = new Vector3(p2.x, 0, p2.y);
Vector3 crossVal = Vector3.Cross(p3,p4);
return Vector3.Dot(Vector3.up, crossVal) >= 0;
}