gameloft数学算法Word文件下载.docx
- 文档编号:15064454
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:15
- 大小:114.59KB
gameloft数学算法Word文件下载.docx
《gameloft数学算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《gameloft数学算法Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
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
<
Forexample:
>
GDGameDesign
1.3Reference
Informof:
No.,AuthorNameor/andCompanyName,DocumentName,DocumentVersion,DocumentID(optional).Forexample:
[1]YuFei,Gameloft,“GameDesignSpecification”,V0.001.
1.4Other
Optional>
Ifyouhaveanyintroductioninformationspecifictothisdocument,pleasewritethemhereoraddanew“Heading2”toholdthem.>
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;
dy)
{
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;
dx)mn=dy;
//returnthedistance
return((dx+dy)-(mn>
1)-(mn>
2)+(mn>
3));
两种算法测试:
用1000和10000组随机数据做测试,结果表明
approx_distance2D平均误差为1%,fastDistance2D平均误差为3%-3.5%,
2.2.2点到直线
基于上一小节两点间距离的快速近似算法,通过推导,可以得出点到直线的快速近似算法。
如下:
/**
*Calculatedistanceofapointtoaline.<
br>
*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;
90)
dir=180-dir;
if(op==COS)
sign*=-1;
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<
ymin)code|=CS_BOTTOM;
if(x>
xmax)code|=CS_RIGHT;
if(x<
xmin)code|=CS_LEFT;
returncode;
如果返回得code得值为0就可以判断点和矩形发生了碰撞。
2.4.2直线和矩形
判断直线(线段)和矩形相交的算法。
对于大多数游戏都没用,但如果允许任意角度的射线(比如子弹轨迹),那么它就很有用了。
这个算法的核心思想就是把坐标按照矩形分为九个小的区域,然后依据直线端点所在的区域分别进行计算,这样可以大大减少计算量。
/**
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gameloft 数学 算法