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

原创 2017年01月03日 23:44:06

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

向量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同向:

【原创】游戏中两个常用的数学运算推导及算法推论 - 远行的风 - 风的驿站

也就是说点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)

倒角公式的推导如下:

【原创】游戏中两个常用的数学运算推导及算法推论 - 远行的风 - 风的驿站

如图,直线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)正是下面的三阶行列式的值:

【原创】游戏中两个常用的数学运算推导及算法推论 - 远行的风 - 风的驿站

 

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java常用数学运算

public class Arith { // 默认除法运算精度 /** The Constant DEF_DIV_SCALE. */ private static final...

行测之数学运算——常用解题技巧

数学运算中的常用解题技巧有尾数法、带入排除法、特值法、裂项相消法、提取公因式、适当组合法等。       (一)尾数法    尾数法是指在考试过程中,不计算算式各项的值,只考虑算式各项的尾数,进而确定...

【Unity3D】 Mathy(常用数学运算,C#)

**在unity游戏开发中,我们常常需要用到一些数学运算,比如摄像机的移动,人物移动,怪物ai的巡逻,技能特效的角度等等,下面是整理出一些常用(也可以说是比较简单的)的数学运算公式。**Mathf.L...

常用的数学运算工具类

public class ArithUtil { /* 默认除法运算精度 / private static final int DEF_DIV_SCALE = 10;/** 这个类...

数学运算精讲 详细算法

  • 2009-10-27 13:23
  • 1.94MB
  • 下载

大精度的数学运算

用2个栈实现数学运算

在看《Algorithm》这本书时看到一个算法,可以很巧妙地实现对一个式子(字符串)实现运算,例如输入((1 + 2)* ( 1 / 2 ) ) =, 可以得到1.5. 其基本原理是: 1.构建2个...

数学运算中的四舍五入

  • 2011-05-07 18:46
  • 624B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)