注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风的驿站

一徐清风,半指烛光,觥筹已净,只余茶香。残卷一章,妙趣非常,忽闻帘响,愿闻其详?

 
 
 

日志

 
 
关于我

喜欢写生 编程 音乐 设计 喜欢把自己的想法变成实实在在的东西 喜欢安静的做一些事情 CSDN博客:http://blog.csdn.net/qwertyupoiuytr

网易考拉推荐

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

2014-08-09 22:14:52|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

向量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其中ijk分别为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,则ABC三点共线(在同一直线上)。

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

三个点A(x1, y1)B(x2, y2)C(x3, y3)不变,过AB做一条直线,此时可以通过向量ABAC叉积系数(x1·y2+x2·y3+x3·y1-x1·y3-x2·y1-x3·y2)的符号来区分点CAB所在直线的哪一侧(我们可以理解为顺时针一侧或者逆时针一侧)。因此给定一系列的点C1C2C3……,可以通过计算叉积的系数来将这一系列的点分为两组,每组各位于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)正是下面的三阶行列式的值:

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

 

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




  评论这张
 
阅读(191)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017