gameloft数学算法.docx

上传人:b****3 文档编号:2146414 上传时间:2022-10-27 格式:DOCX 页数:15 大小:114.59KB
下载 相关 举报
gameloft数学算法.docx_第1页
第1页 / 共15页
gameloft数学算法.docx_第2页
第2页 / 共15页
gameloft数学算法.docx_第3页
第3页 / 共15页
gameloft数学算法.docx_第4页
第4页 / 共15页
gameloft数学算法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

gameloft数学算法.docx

《gameloft数学算法.docx》由会员分享,可在线阅读,更多相关《gameloft数学算法.docx(15页珍藏版)》请在冰豆网上搜索。

gameloft数学算法.docx

gameloft数学算法

TableofContents

1Introduction4

1.1PurposeandScope4

1.2Abbreviation4

1.3Reference4

1.4Other4

2Mathematicsin2DGames4

2.1定点数4

2.1.1定点数的的应用4

2.1.2定点数算法4

2.2距离的计算4

2.2.1点到点4

2.2.2点到直线4

2.3三角函数5

2.4碰撞和裁剪5

2.4.1点和矩形5

2.4.2直线和矩形5

2.4.3矩形和矩形5

2.4.4剪裁区域5

2.5其他算法5

2.5.1平方根5

2.5.2排序5

2.5.3环行队列5

ListofTables

Table21Thefirsttable’scaption.4

Table22Thesecondtable’scaption.4

ListofFigures

Figure21Thefirstfigure’scaption.4

Figure22Thesecondfigure’scaption.4

1

Introduction

1.1PurposeandScope

1.2Abbreviation

>

GDGameDesign

1.3Reference

No.,AuthorNameor/andCompanyName,DocumentName,DocumentVersion,DocumentID(optional).Forexample:

>

[1]YuFei,Gameloft,“GameDesignSpecification”,V0.001.

1.4Other

2Mathematicsin2DGames

2.1定点数

定点数就是用整数来表示浮点数。

方法是把浮点数扩大一定倍数,取整成整数。

在计算机里,这个倍数通常是2的幂,这样方便快速计算。

2.1.1定点数的的应用

由于手机通常不支持浮点数,J2ME也不支持,所以定点数被大量用于模拟浮点数。

在2D游戏中,定点数主要用于存坐标值,这样移动速度就可以是半个象素,四分之一个象素,等等。

2.1.2定点数算法

以下都假设a,b是两个定点数,c是计算结果,f是因子,就是扩大的倍数。

∙浮点数转换到定点数

定点数=浮点数*转换因子(倍数)

∙加法

c=a+b

∙减法

c=a–b

∙乘法

c=a*b/f,如果f是2的幂,那么可以用右移做除法

∙除法

c=a/b,这里假设小数部分会被抵消,精确的计算比较麻烦,在2D游戏里基本不用。

其实除法在2D游戏里用得也很少。

2.2距离的计算

2.2.1点到点

假设有两点(X0,Y0),(X1,Y1)

dx=X1-X0;dy=Y1-Y0

计算两点间距离的精确算法是distance2D=sqt(abs(dx)+abs(dy))。

由于J2ME不支持浮点运算,在J2ME2D游戏中也可以用近似算法计算两点间距离,一方面能取得较快速度,精度上也不会有太大损失。

intapprox_distance2D(intdx,intdy)

{

intmin,max;

if(dx<0)dx=-dx;

if(dy<0)dy=-dy;

if(dx

{

min=dx;

max=dy;

}else{

min=dy;

max=dx;

}

//coefficientsequivalentto(123/128*max)and(51/128*min)

return(((max<<8)+(max<<3)-(max<<4)-(max<<1)+

(min<<7)-(min<<5)+(min<<3)-(min<<1))>>8);

}

如果在游戏需要经常计算点到点的距离,同时对精度要求也不太高,我们可以损失一点精度而取得更快的速度。

这就是下面的快速近似算法。

intfastDistance2D(intdx,intdy)

{

//thisfunctioncomputesthedistancefrom0,0tox,ywith3.5%error

//firstcomputetheabsolutevalueofx,y

if(dx<0)dx=-dx;

if(dy<0)dy=-dy;

//computetheminimumofdx,dy

//intmn=Math.min(dx,dy);

intmn=dx;

if(dy

//returnthedistance

return((dx+dy)-(mn>>1)-(mn>>2)+(mn>>3));

}

两种算法测试:

用1000和10000组随机数据做测试,结果表明

approx_distance2D平均误差为1%,fastDistance2D平均误差为3%-3.5%,

2.2.2点到直线

基于上一小节两点间距离的快速近似算法,通过推导,可以得出点到直线的快速近似算法。

如下:

   /**

    *Calculatedistanceofapointtoaline.

    *Pointis(x0,y0).

    *Lineislinkedby(x1,y1)and(x2,y2).

*/

publicstaticintdistPointToLine(intx0,inty0,intx1,inty1,intx2,inty2)

   {

       //getthelineformula:

Ax+By+C=0

       intA=y2-y1;

       intB=x1-x2=-(x2-x1);

       intC=x2*y1-x1*y2;

       //thedistance:

abs(A*x0+B*y0+C)/sqrt(A*A+B*B):

参看下面推导

//iffastDistance2D(A,B)==0,……….

       returnMath.abs(A*x0+B*y0+C)/fastDistance2D(A,B);

}

推导

直线方程是y=(A/B)*x+C/B

所以在点(x0,y0)出做向X轴的直线,那么和直线的交点就是

(x4,y4)=(x0,(A/B)*x0+C/B)

所以垂直距离是(y4–y0)*B/DistanceAB=((A/B)*x0+C/B-y0)*B/DistanceAB

=(A*x0-y0*B+C)/DistanceAB

2.3三角函数

快速计算sin和cos的方法

1.SplinterCellPT里面提供的一种算法

Sin(angle)=angle-angle*angle*angle/(6*100*100);

Cos(angle)=1*100-angle*angle/(2*100);

这儿的angle是以弧度为单位,由于J2ME不支持浮点运算,把Pi扩大了一百倍(314)。

该方法比较实用,也比较精确

2.ZengXiaoBing提供的一种算法

单位是角度,扩大了8100倍

publicfinalstaticintSIN=0;

publicfinalstaticintCOS=1;

publicstaticintsc(intop,intdir)

{

intsign=1;

//while(dir<0)dir+=360;

while(dir>360)dir-=360;

if(dir>=180)

{

dir-=180;

sign=-1;

}

if(dir>90)

{

dir=180-dir;

if(op==COS)

sign*=-1;

}

if(op==COS)

dir=90-dir;

//returnsign*SIN_VALUE[(dir+5)/10];

returnsign*(8100-(90-dir)*(90-dir));

//useparabolatosimulatesinecurve

}

原理是用抛物线来模拟正弦曲线。

注意:

PT版本的cos函数,在0-45度(0-157/2)内准确度是很高的,但在45-90度间,准确度极度下降(误差%6.7),而且当angle大于141后,会出现负数的情况。

所以,建议只在0-45度间使用,超过45度的,用sin(157–angle)求余弦,用cos(157–angle)求正弦。

2.4碰撞和裁剪

2.4.1点和矩形

点和矩形是否碰撞,只需判断该点位于矩形得内部区域就可以了。

staticpublicfinalintCS_TOP=0x01;

staticpublicfinalintCS_BOTTOM=0x02;

staticpublicfinalintCS_RIGHT=0x04;

staticpublicfinalintCS_LEFT=0x08;

publicstaticintCompOutcode(intx,inty,intxmin,intymin,intxmax,intymax)

{

intcode=0;

if(y>ymax)code|=CS_TOP;

if(y

if(x>xmax)code|=CS_RIGHT;

if(x

returncode;

}

如果返回得code得值为0就可以判断点和矩形发生了碰撞。

2.4.2直线和矩形

判断直线(线段)和矩形相交的算法。

对于大多数游戏都没用,但如果允许任意角度的射线(比如子弹轨迹),那么它就很有用了。

这个算法的核心思想就是把坐标按照矩形分为九个小的区域,然后依据直线端点所在的区域分别进行计算,这样可以大大减少计算量。

/**

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1