游戏中两个常用的数学运算推导及算法推论

在数学中,几何向量(也称为欧几里得向量,通常简称向量、矢量),指具有大小和方向的几何对象,可以形象化地表示为带箭头的线段:箭头所指,代表向量的方向。

向量a的大小记做|a|

向量满足平行四边形定则(也叫三角形定则),即两个力合成时,以表示这两个力的线段为邻边作平行四边形,这两个邻边之间的对角线就代表合力的大小和方向。

向量的数量积(又叫做点积或内积)是一个值,记做a·ba·b=|a|·|b|·cosab〉,其中〈ab〉表示向量a和向量b的夹角,向量夹角的取值范围在0到π之间。

向量的向量积(又叫做外积或叉积)是一个向量,记作a×b(这里“×”并不是乘号,只是一种表示方法,与“·”不同,也可记做“^”),a×b的大小等于|a|·|b|·sinab〉。a×b的方向满足右手定则,即若坐标系满足右手定则(右手系)时,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向的方向就是a×b的方向。

若向量a=(xa, ya, za),向量b=(xb, yb, zb),则a×b=(ya·zb-za·yb)i+(za·xb-xa·zb)j+(xa·yb-ya·xb)k,其中i,j,k分别为xyz轴的单位向量(长度为1,方向为坐标轴方向)

这里应用上面向量的知识,我们来判断平面上三个点的位置关系:

给定三个点A(x1, y1)B(x2, y2)C(x3, y3),设ij分别为x轴和y轴的单位向量,向量AB=(x2-x1, y2-y1),向量AC=(x3-x1, y3-y1)AB×AC(差乘)=[(x2-x1)(y3-y1)-(x3-x1)(y2-y1)]k=(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)k,因此当向量k的系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)大于0时,向量AB和向量AC的叉积沿z轴正向,小于0时,沿z轴负向,因此若z轴方向从屏幕所在平面内部指向外部,则根据右手定则,当系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)为正时,向量AB顺时针转动一个小于180度的角度后能够与AC同向:

游戏中两个常用的数学运算推导及算法推论_第1张图片

也就是说点A->B->C按照逆时针的方向组成三角形。反之,如果系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)为负,则A->B->C按照顺时针方向组成三角形。如果系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)为0,则A、B、C三点共线(在同一直线上)。

利用上面得到的结论,我们得到下面的推论:

三个点A(x1, y1)B(x2, y2)C(x3, y3)不变,过AB做一条直线,此时可以通过向量ABAC叉积系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)的符号来区分点C在AB所在直线的哪一侧(我们可以理解为顺时针一侧或者逆时针一侧)。因此给定一系列的点C1,C2,C3……,可以通过计算叉积的系数来将这一系列的点分为两组,每组各位于AB所在直线的一侧。

 

下面是利用三个点A(x1, y1)B(x2, y2)C(x3, y3)的坐标和向量的知识求解三角形ABC面积的推导。

首先是正切的到角公式,我们记向量ABAC的夹角为α,直线AB的斜率为kAB,直线AC的斜率为kAC,则有下面的公式:

tanα=(kAC-kAB) / (1+kAB·kAC)

倒角公式的推导如下:

游戏中两个常用的数学运算推导及算法推论_第2张图片

如图,直线ABx轴的夹角为β,ACx轴的夹角为γ,则kAB=tanβ,kAC=tanγ,因此tanα=tan(γ-β)(三角形外角公式)

tan(γ-β)=(tanγ-tanβ) / (1+tanγ·tanβ)(两角和差的正切公式)

因此将kAB=tanβ,kAC=tanγ带入上面的式子得到到角公式。

接着来求三角形ABC的面积:

我们知道三角形的面积等于二分之一底乘高,我们以AB为底,高h=|AC|×|sinα|(注:|AC|为向量AC的长度),因此面积S=1/2 × |AB× |AC× |sinα|=1/2 × |AB× |AC× |cosα| × |sinα| / |cosα|,其中:

|AB× |AC× |cosα|=|AB·AC|ABAC的数量积的绝对值)=|(x3-x1)(x2-x1)+(y3-y1)(y2-y1)|

|sinα| / |cosα|=|tanα|=|[(x2-x1)(y3-y1)-(x3-x1)(y2-y1)]/ [(x2-x1)(x3-x1)+(y2-y1)(y3-y1)]|

将上面两个式子带入到三角形面积的计算公式中,化简得到:

三角形面积S=1/2 × |x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2|,可以看到(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)正是我们前面推导三个点的位置关系时用到的系数。

此外,还可以联系行列式的知识来表示三角形的面积,(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)正是下面的三阶行列式的值:

游戏中两个常用的数学运算推导及算法推论_第3张图片

 

如果有什么问题欢迎留言~

你可能感兴趣的:(算法,程序设计,算法)