📄 global.cpp
字号:
/*Copyright (C) 2005 Ferdowsi University*/#include "global.h" #include <zeitgeist/zeitgeist.h>using namespace zeitgeist;namespace global{/************* variables ***************/ // field parameters float FieldLength = 105.0; float FieldWidth = 68.0; float FieldHeight = 20.0; float GoalWidth = 7.32; float GoalDepth = 2.0; float GoalHeight = 2.44; float BorderSize = 4.0f; // agent parameters int AgentMass = 75; float AgentRadius = 0.22; int AgentMaxSpeed = 10; // ball parameters float BallRadius = 0.111; float BallMass = 0.4; float KickDistance = AgentRadius + BallRadius + 0.07;//0.15;//04; float MinKickDistance = AgentRadius + BallRadius + 0.04;//04;/************* variables ***************/ // the playes uniform number, if left to zero the server will allocate // the next free unum int MyNumber = 0; // the default team name string MyTeamName = ""; string TheirTeamName = ""; LogUnit logunit; Player MyPlayer[12]; Player TheirPlayer[12]; FieldObject object[9]; Ball ball; MySelf self; TTeamIndex TeamIndex; float CurrentTime; ActionInfo action_info; bool do_beam_on_kickof=true; AdjustKickPosition AdjustKickPos; Vector3f predicted_ball_pos[41]; int stop_index; Field FieldInfo; Tackle tackle;/************* functions ***************/ float Deg2Rad(float deg) { return (deg*PI)/180.0f; } float Rad2Deg(float x) { return float(x*57.2958); } float ATan(float x){ //DoLog(LOG_POS,"ATan(%.2f)=%.2f",x,float(Rad2Deg(float(atan(x))))); return float(Rad2Deg(float(atan(x)))); } float Tan(float deg){ return float(tan(Deg2Rad(deg))); } Vector3f pol2vector(pol tmp) { Vector3f i; i[0]=tmp.distance*(float)cos(Deg2Rad(tmp.phi))*(float)cos(Deg2Rad(tmp.theta)); i[1]=tmp.distance*(float)cos(Deg2Rad(tmp.phi))*(float)sin(Deg2Rad(tmp.theta)); i[2]=tmp.distance*(float)sin(Deg2Rad(tmp.phi)); return i; } void InitObjects() { if(TeamIndex == TI_LEFT){ object[VO_FLAG1L].pos = Vector3f(-FieldLength/2, -FieldWidth/2, 0.0); object[VO_FLAG1R].pos = Vector3f(FieldLength/2, -FieldWidth/2, 0.0); object[VO_FLAG2L].pos = Vector3f(-FieldLength/2, FieldWidth/2, 0.0); object[VO_FLAG2R].pos = Vector3f(FieldLength/2, FieldWidth/2, 0.0); object[VO_GOAL1L].pos = Vector3f(-FieldLength/2, -GoalWidth/2, 0.0); object[VO_GOAL1R].pos = Vector3f(FieldLength/2, -GoalWidth/2, 0.0); object[VO_GOAL2L].pos = Vector3f(-FieldLength/2, GoalWidth/2, 0.0); object[VO_GOAL2R].pos = Vector3f(FieldLength/2, GoalWidth/2, 0.0); } else{ object[VO_FLAG1L].pos = Vector3f(FieldLength/2, FieldWidth/2, 0.0); object[VO_FLAG1R].pos = Vector3f(-FieldLength/2, FieldWidth/2, 0.0); object[VO_FLAG2L].pos = Vector3f(FieldLength/2, -FieldWidth/2, 0.0); object[VO_FLAG2R].pos = Vector3f(-FieldLength/2, -FieldWidth/2, 0.0); object[VO_GOAL1L].pos = Vector3f(FieldLength/2, GoalWidth/2, 0.0); object[VO_GOAL1R].pos = Vector3f(-FieldLength/2, GoalWidth/2, 0.0); object[VO_GOAL2L].pos = Vector3f(FieldLength/2, -GoalWidth/2, 0.0); object[VO_GOAL2R].pos = Vector3f(-FieldLength/2, -GoalWidth/2, 0.0); } } float NormalizeAngle(float ang,float min=-180.0f){ while(ang>=360+min) ang-=360; while(ang<min) ang+=360; return ang; } float MidAngle(float ang1,float ang2){ float ang=NormalizeAngle(ang2-ang1,0.0f); //DoLog(LOG_POS,"ang1=%.2f ang2=%.2f midang=%.2f",ang1,ang2,NormalizeAngle(ang1+ang/2.0f)); return NormalizeAngle(ang1+ang/2.0f); } float GetSlopeOfMidAngle(float ang1,float ang2){ return -Tan(MidAngle(ang1,ang2)); } // simulating if the ball can be intercepted while shooting bool OpponentCanIntercept(Vector3f ball_vel){ float MinVel = 0.3; float radious[12]={0}; float MaxPlayerSpeed = 0.25; //meter per cycle Vector3f ball_pos = ball.pos; Vector3f ball_decay; ball_pos[0] = 0.0; ball_vel[0] = 0.0; Vector3f temp = ball_vel; while(ball_vel.Length() > MinVel){ if(fabs(ball_vel[0])>1.5) ball_decay[0]=0.78; else if(fabs(ball_vel[0])>1) ball_decay[0]=0.80; else if(fabs(ball_vel[0])>0.85) ball_decay[0]=0.85; else ball_decay[0]=0.88; if(fabs(ball_vel[1])>1.5) ball_decay[1]=0.78; else if(fabs(ball_vel[1])>1) ball_decay[1]=0.80; else if(fabs(ball_vel[1])>0.85) ball_decay[1]=0.85; else ball_decay[1]=0.88; ball_pos = ball_pos + ball_vel; ball_vel[0]=ball_vel[0]*ball_decay[0]; ball_vel[1]=ball_vel[1]*ball_decay[1]; } Vector3f target = ball_pos; // this while simulates each cycle ball_pos = ball.pos; ball_vel = temp; while(ball_vel.Length() > MinVel){ if(fabs(ball_vel[0])>1.5) ball_decay[0]=0.78; else if(fabs(ball_vel[0])>1) ball_decay[0]=0.80; else if(fabs(ball_vel[0])>0.85) ball_decay[0]=0.85; else ball_decay[0]=0.88; if(fabs(ball_vel[1])>1.5) ball_decay[1]=0.78; else if(fabs(ball_vel[1])>1) ball_decay[1]=0.80; else if(fabs(ball_vel[1])>0.85) ball_decay[1]=0.85; else ball_decay[1]=0.88; ball_pos = ball_pos + ball_vel; ball_vel[0]=ball_vel[0]*ball_decay[0]; ball_vel[1]=ball_vel[1]*ball_decay[1]; for(int i=1;i<12;i++){ radious[i] += MaxPlayerSpeed; if((ball_pos - TheirPlayer[i].pos).Length() < radious[i] || (target - TheirPlayer[i].pos).Length() - radious[i] < 4) return true; // opponent can intercept the ball! } } return false; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -