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

原创 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小游戏开发练习(一)---推箱子

一、游戏功能 游戏由障碍、空地、箱子、终点与玩家组成。 通过上下左右控制玩家推动箱子。当箱子的推动方向没有障碍时,向前移动到新的位置,玩家也向前移动一步。 当所有箱子都处于终点时,游戏胜利,按回车键进...
  • cyendra
  • cyendra
  • 2013年12月30日 21:45
  • 1628

深度学习BP算法的推导(附加RNN,LSTM的推导说明)

注:这篇文章主要参考Alex Graves的博士论文《Supervised Sequence Labelling with Recurrent Neural Networks》 详细介绍其关于BP算法...
  • ChangHongJian
  • ChangHongJian
  • 2014年12月09日 13:57
  • 43780

c++之简单的推箱子游戏

linux 可运行推箱子游戏,只有一个箱子,地图固定,人可以到达目标地点并且离开后,目标地点不会被刷掉。...
  • zhoutian_19950630
  • zhoutian_19950630
  • 2017年01月16日 16:46
  • 1753

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

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

常用的数学运算工具类

public class ArithUtil { /* 默认除法运算精度 / private static final int DEF_DIV_SCALE = 10;/** 这个类...
  • asdasdqweqw
  • asdasdqweqw
  • 2016年11月10日 13:23
  • 92

JAVA之Math类常用数学运算记录

Math中定义了许多的方法,且这些方法均为static类型,通过Math类就能直接调用。  调用形式:Math.方法名 例如,我要进行e运算,那么我直接调用Math.exp(double 类型 数值)...
  • whq19890827
  • whq19890827
  • 2016年05月22日 16:39
  • 3807

math.h头文件中声明了常用的一些数学运算(pow, sqrt, ceil,floor)

转自:http://blog.csdn.net/zhongbeida_xue/article/details/51252303 math.h头文件中声明了常用的一些数学运算 ...
  • zhanglizhi111
  • zhanglizhi111
  • 2017年03月16日 13:59
  • 803

Java常用数学运算

public class Arith { // 默认除法运算精度 /** The Constant DEF_DIV_SCALE. */ private static final...
  • ko0491
  • ko0491
  • 2016年12月20日 09:26
  • 146

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

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

数学运算精讲 详细算法

  • 2009年10月27日 13:23
  • 1.94MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:游戏中两个常用的数学运算推导及算法推论
举报原因:
原因补充:

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