实验二 聚集与及避障实验报告_第1页
实验二 聚集与及避障实验报告_第2页
实验二 聚集与及避障实验报告_第3页
实验二 聚集与及避障实验报告_第4页
实验二 聚集与及避障实验报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.范文.实验二聚集与避障实验报告一、实验目的掌握游戏中聚集与避障的人工智能算法,理解宽视野和有限视野的区别二、实验仪器Windows7系统MicrosoftVisualStudio2015三、实验原理及过程//描述聚集与避障的算法原理//描述程序实现时的思路包括对每个调用的API进行详细说明智能体只考虑哪些在检测盒内的障碍物。初始的时候,要将游戏世界中所有的障碍物都迭代到内存中,并标记哪些在检测盒内的障碍物以作进一步分析,然后把所有已经标记的障碍物都转换到智能体的局部空间。转换坐标后,那些x坐标为负值的物体将不被考虑,所以问题就变得简单多了,接下来必须要检测障碍物是否和检测盒重叠。使障碍物的包围半径扩大检测盒宽度的一半。然后测试该障碍物的y值是否小于这个值(即障碍物的包围半径加上检测盒宽度的一半)。此时,只剩下那些与检测盒相交的障碍物了。接下来我们找出离智能体最近的相交点。再一次在局部空间中计算,第三步中扩大了障碍物的包围半径。用简单的线圆周相交测试方法可以得到被扩大的圈和x轴的相交点。实验结果五、实验心得(需包括有何不足如何改进)//你认为目前的聚集与避障有什么不足之处,如何改进目前的聚集与避障的不足之处在于:可能会因为错误的方案设计而搞错导致路线的躲闪。还有就是从实验2开始,我的电脑本身出现了COMCTL32.LIB文件LINK的错误,后来在同学的帮助下我解决了这个问题。如何改进:实验前必须要经过精确的计算并且代码不能出现任何错误。把COMCTL32.LIB文件载入文件以让程序正确运行。主要代码#include"main.h"#include"time.h"//---------------------------------------------------------------------------/*Book:AIforGameDevelopersAuthors:DavidM.Bourg&GlennSeemannExample:Flocking,Chapter4*///---------------------------------------------------------------------------#define _TIMESTEP 0.0025#define _TOL 1e-10#define _FWDTIME 10#define _THRUSTFACTOR 1.0#define_CHASESETUP true#define _SPAWN_AREA_R 100#define _MAX_NUM_UNITS 20#define _UNIT_LENGTH 4#define _OBSTACLE_RADIUS_FACTOR 8#define _OBSTACLE_RADIUS _OBSTACLE_RADIUS_FACTOR*_UNIT_LENGTH#define _COLLISION_VISIBILITY_FACTOR 25#define _WIDEVIEW_RADIUS_FACTOR 200#define _NARROWVIEW_RADIUS_FACTOR 50#define _LIMITEDVIEW_RADIUS_FACTOR 30#define _SEPARATION_FACTOR 5#define _BACK_VIEW_ANGLE_FACTOR 1#define _FRONT_VIEW_ANGLE_FACTOR 1#define _NUM_OBSTACLES 8//GlobalVariables:int FrameCounter=0;RigidBody2D Units[_MAX_NUM_UNITS];Vector Target;Vector Obstacles[_NUM_OBSTACLES];bool Initialize(void){ inti; GetRandomNumber(0,_WINWIDTH,true); for(i=0;i<_MAX_NUM_UNITS;i++) { Units[i].fMass=10; Units[i].fInertia=10; Units[i].fInertiaInverse=1/10; Units[i].vPosition.x=GetRandomNumber(_WINWIDTH/2-_SPAWN_AREA_R,_WINWIDTH/2+_SPAWN_AREA_R,false); Units[i].vPosition.y=GetRandomNumber(_WINHEIGHT/2-_SPAWN_AREA_R,_WINHEIGHT/2+_SPAWN_AREA_R,false); Units[i].fWidth=_UNIT_LENGTH/2; Units[i].fLength=_UNIT_LENGTH; Units[i].fHeight=_UNIT_LENGTH; Units[i].fOrientation=GetRandomNumber(0,360,false); Units[i].CD.y=-0.12*Units[i].fLength; Units[i].CD.x=0.0f; //coordinatesofthebodycenterofdrag Units[i].CT.y=-0.50*Units[i].fLength; Units[i].CT.x=0.0f; //coordinatesofthepropellerthrustvector Units[i].CPT.y=0.5*Units[i].fLength; Units[i].CPT.x=-0.5*Units[i].fWidth; //coordinatesoftheportbowthruster Units[i].CST.y=0.5*Units[i].fLength; Units[i].CST.x=0.5*Units[i].fWidth; //coordinatesofthestarboardbowthruster Units[i].ProjectedArea=(Units[i].fLength+Units[i].fWidth)*Units[i].fHeight; Units[i].Leader=false; if(i>_MAX_NUM_UNITS/2) { Units[i].Interceptor=true; Units[i].ThrustForce=_THRUSTFORCE*1.5f; }else{ Units[i].Interceptor=false; Units[i].ThrustForce=_THRUSTFORCE; } } for(i=0;i<_NUM_OBSTACLES;i++) { Obstacles[i].x=GetRandomNumber(_OBSTACLE_RADIUS*4,_WINWIDTH-_OBSTACLE_RADIUS*4,false); Obstacles[i].y=/*_WINHEIGHT/2;*/GetRandomNumber(_OBSTACLE_RADIUS*4,_WINHEIGHT-_OBSTACLE_RADIUS*4,false); } returntrue;}void DoUnitAI(inti){ int j; int N; Vector Pave; Vector Vave; Vector Fs; Vector Pfs; Vector d,u,v,w; double m; int Nf; bool InView; bool DoFlock=WideView||LimitedView||NarrowView; int RadiusFactor; //beginFlockAI Fs.x=Fs.y=Fs.z=0; Pave.x=Pave.y=Pave.z=0; Vave.x=Vave.y=Vave.z=0; N=0; Pfs.x=0; Pfs.y=Units[i].fLength/2.0f; Nf=0; for(j=1;j<_MAX_NUM_UNITS;j++) { if(i!=j) { InView=false; d=Units[j].vPosition-Units[i].vPosition; w=VRotate2D(-Units[i].fOrientation,d); if(((w.y>0)&&(fabs(w.x)<fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR))) if(d.Magnitude()<=(Units[i].fLength*_NARROWVIEW_RADIUS_FACTOR)) Nf++; if(WideView) { InView=((w.y>0)||((w.y<0)&&(fabs(w.x)>fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR))); RadiusFactor=_WIDEVIEW_RADIUS_FACTOR; } if(LimitedView) { InView=(w.y>0); RadiusFactor=_LIMITEDVIEW_RADIUS_FACTOR; } if(NarrowView) { InView=(((w.y>0)&&(fabs(w.x)<fabs(w.y)*_FRONT_VIEW_ANGLE_FACTOR))); RadiusFactor=_NARROWVIEW_RADIUS_FACTOR; } if(InView&&(Units[i].Interceptor==Units[j].Interceptor)) { if(d.Magnitude()<=(Units[i].fLength*RadiusFactor)) { Pave+=Units[j].vPosition; Vave+=Units[j].vVelocity; N++; } } //SeparationRule: if(InView)//(w.y>0)||((w.y<0)&&(fabs(w.x)>fabs(w.y)*_BACK_VIEW_ANGLE_FACTOR))) { if(d.Magnitude()<=(Units[i].fLength*_SEPARATION_FACTOR)) { if(w.x<0)m=1; if(w.x>0)m=-1; Fs.x+=m*_STEERINGFORCE*(Units[i].fLength*_SEPARATION_FACTOR)/d.Magnitude(); } } } } //CohesionRule: if(DoFlock&&(N>0)) { Pave=Pave/N; v=Units[i].vVelocity; v.Normalize(); u=Pave-Units[i].vPosition; u.Normalize(); w=VRotate2D(-Units[i].fOrientation,u); if(w.x<0)m=-1; if(w.x>0)m=1; if(fabs(v*u)<1.0f) Fs.x+=m*_STEERINGFORCE*acos(v*u)/pi; } //AlignmentRule: if(DoFlock&&(N>0)) { Vave=Vave/N; u=Vave; u.Normalize(); v=Units[i].vVelocity; v.Normalize(); w=VRotate2D(-Units[i].fOrientation,u); if(w.x<0)m=-1; if(w.x>0)m=1; if(fabs(v*u)<1) Fs.x+=m*_STEERINGFORCE*acos(v*u)/pi; } //Chasethetargetiftheunitisaleader if(Chase) { if(Nf==0) Units[i].Leader=true; else Units[i].Leader=false; if((Units[i].Leader||!DoFlock)) { if(!Units[i].Interceptor) { //Chase u=Units[0].vPosition; d=u-Units[i].vPosition; w=VRotate2D(-Units[i].fOrientation,d); if(w.x<0)m=-1; if(w.x>0)m=1; Fs.x+=m*_STEERINGFORCE; }else{ //Intercept Vector s1,s2,s12; double tClose; Vector Vr12; Vr12=Units[0].vVelocity-Units[i].vVelocity;//closingvelocity s12=Units[0].vPosition-Units[i].vPosition;//rangetoclose tClose=s12.Magnitude()/Vr12.Magnitude();//timetoclose s1=Units[0].vPosition+(Units[0].vVelocity*tClose); Target=s1; s2=s1-Units[i].vPosition; w=VRotate2D(-Units[i].fOrientation,s2); if(w.x<0)m=-1; if(w.x>0)m=1; Fs.x+=m*_STEERINGFORCE; } } } //Collisionavoidance(withstaticobstacles) Vector a,p,b; for(j=0;j<_NUM_OBSTACLES;j++) { u=Units[i].vVelocity; u.Normalize(); v=u*_COLLISION_VISIBILITY_FACTOR*Units[i].fLength; a=Obstacles[j]-Units[i].vPosition; p=(a*u)*u; b=p-a; if((b.Magnitude()<_OBSTACLE_RADIUS)&&(p.Magnitude()<v.Magnitude())) { //impendingcollision...steeraway w=VRotate2D(-Units[i].fOrientation,a); w.Normalize(); if(w.x<0)m=1; if(w.x>0)m=-1; Fs.x+=m*_STEERINGFORCE*(_COLLISION_VISIBILITY_FACTOR*Units[i].fLength)/a.Magnitude(); } } //applyaccumulatedsteeringforce Units[i].Fa=Fs; Units[i].Pa=Pfs; //endFlockAI}void UpdateSimulation(void){ double dt=_TIMESTEP; int i; //initializethebackbuffer if(FrameCounter>=_RENDER_FRAME_COUNT) { ClearBackBuffer(); DrawObstacles(); } //Updateplayercontrolledunit: Units[0].SetThrusters(false,false,1); Units[0].SetThrusters(false,false,1); if(IsKeyDown(VK_RIGHT)) Units[0].SetThrusters(true,false,0.5); if(IsKeyDown(VK_LEFT)) Units[0].SetThrusters(false,true,0.5); Units[0].UpdateBodyEuler(dt); if(FrameCounter>=_RENDER_FRAME_COUNT) DrawCraft(Units[0],RGB(0,255,0)); if(Units[0].vPosition.x>_WINWIDTH)Units[0].vPosition.x=0; if(Units[0].vPosition.x<0)Units[0].vPosition.x=_WINWIDTH; if(Units[0].vPosition.y>_WINHEIGHT)Units[0].vPosition.y=0; if(Units[0].vPosition.y<0)Units[0].vPosition.y=_WINHEIGHT; //updatecomputercontrolledunits: for(i=1;i<_MAX_NUM_UNITS;i++) { DoUnitAI(i); Units[i].UpdateBodyEuler(dt); if(FrameCounter>=_RENDER_FRAME_COUNT) { if(Units[i].Leader) DrawCraft(Units[i],RGB(255,0,0)); else{ if(Units[i].Interceptor) DrawCraft(Units[i],RGB(255,0,255)); else DrawCraft(Units[i],RGB(0,0,255)); } } if(Units[i].vPosition.x>_WINWIDTH)Units[i].vPosition.x=0; if(Units[i].vPosition.x<0)Units[i].vPosition.x=_WINWIDTH; if(Units[i].vPosition.y>_WINHEIGHT)Units[i].vPosition.y=0; if(Units[i].vPosition.y<0)Units[i].vPosition.y=_WINHEIGHT; }//endi-loop if(FrameCounter>=_RENDER_FRAME_COUNT){ CopyBackBufferToWindow(); FrameCounter=0; }else FrameCounter++;}void DrawCraft(RigidBody2D craft,COLORREFclr){ Vector vList[5]; double wd,lg; int i; Vector v1; wd=craft.fWidth; lg=craft.fLength; vList[0].y=lg/2; vList[0].x=wd/2; vList[1].y=-lg/2; vList[1].x=wd/2; vList[2].y=-lg/2; vList[2].x=-wd/2; vList[3].y=lg/2; vList[3].x=-wd/2; vList[4].y=lg/2*1.5;vList[4].x=0; for(i=0;i<5;i++) { v1=VRotate2D(craft.fOrientation,vList[i]); vList[i]=v1+craft.vPosition; } DrawLine(vList[0].x,vList[0].y,vList[1].x,vList[1].y,2,clr); DrawLine(vList[1].x,vList[1].y,vList[2].x,vList[2].y,2,clr); DrawLine(vList[2].x,vList[2].y,vList[3].x,vList[3].y,2,clr); DrawLine(vList[3].x,vList[3].y,vList[4].x,vList[4].y,2,clr); DrawLine(vList[4].x,vList[4].y,vList[0].x,vList[0].y,2,clr); if(ShowVectors) { Vector v,u; double f=0.025; //Showvelocityvectorsingreen DrawLine(craft.vPosition.x,craft.vPosition.y,craft.vPosition.x+craft.vVelocity.x,craft.vPosition.y+craft.vVelocity.y,3,RGB(0,255,0)); //Showforcevectorsinblack //thrustvector v.x=0; v.y=craft.ThrustForce*f; v=VRotate2D(craft.fOrientation,v); u.x=craft.CT.x; u.y=craft.CT.y; u=VRotate2D(craft.fOrientation,u); DrawLine(craft.vPosition.x+u.x,craft.vPosition.y+u.y,craft.vPosition.x+u.x+v.x,craft.vPosition.y+u.y+v.y,1,RGB(0,0,0)); //portsteeringforce v.x=craft.PThrust.x*f; v.y=craft.PThrust.y*f; v=VRotate2D(craft.fOrientation,v); u.x=craft.CPT.x; u.y=craft.CPT.y; u=VRotate2D(craft.fOrientation,u); DrawLine(craft.vPosition.x+u.x,craft.vPosition.y+u.y,craft.vPosition.x+u.x+v.x,craft.vPosition.y+u.y+v.y,1,RGB(0,0,0)); //stbdsteeringforce v.x=craft.SThrust.x*f; v.y=craft.SThrust.y*f; v=VRotate2D(craft.fOrientation,v); u.x=craft.CST.x; u.y=craft.CST.y; u=VRotate2D(craft.fOrientation,u); DrawLine(craft.vPosition.x+u.x,craft.vPosition.y+u.y,craft.vPosition.x+u.x+v.x,craft.vPosition.y+u.y+v.y,1,RGB(0,0,0)); //appliedforce v.x=craft.Fa.x*f; v.y=craft.Fa.y*f; v=VRotate2D(craft.fOrientation,v); u.x=craft.Pa.x; u.y=craft.Pa.y; u=VRotate2D(craft.fOrie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论