⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 situation.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	AgentStatus b;
	b.pos=global.wm.ballPos;
	b.vel=global.wm.ballVel;
	b=predictor.predictBallStatusAfterNrCycle(b,1);
	Vector3 a=global.wm.nextPos;
	Vector3 a_b=a-b.pos;
	Angle ang_a_b=a_b.ang();
	if(global.wm.ballVel.mod()>0.5||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball<5||fabs(ang_a_b)<100)
		return true;
	if(!(isBallInOurControl()||isBallBeingInOurControl()))
		return true;
	else return false;
	


}



bool Situation::shouldIIntercept()



{
	int i;
	int flag=0;
	int myITCyc=myITInfo.nCyc;

	/*

	AgentStatus a,b;

	a.pos = global.wm.nextPos;

	a.vel = global.wm.nextVel;

	b.pos = global.wm.ballPos+global.wm.ballVel;

	b.vel = global.wm.ballVel * SS->B_decay;

	b.vel.z = (global.wm.ballVel.z+14.6795*0.2)* 0.8745-14.6795*0.2;

	for(myITCyc=1;myITCyc<myITInfo.nCyc;myITCyc++)

	{

		AgentStatus ball_s = predictor.predictBallStatusAfterNrCycle(b,myITCyc);

		Vector3 dest=ball_s.pos+Vector3(-0.3,0,0);

		int cyc = predictor.predictCycToReachPoint(dest,a);

		if(myITCyc>=cyc)

			break;

	

	}*/

	

	Vector3 g1(X(-100),SS->mGoalWidth/2.);

	Vector3 g2(X(-100),-SS->mGoalWidth/2.);

	Angle angToOurGoal;

	Dist distToOurGoal;

	if(global.wm.ballPos.y>0)

	{

		distToOurGoal=(global.wm.ballPos-g1).mod();

		angToOurGoal=(global.wm.ballPos-g1).ang();

	}

	else

	{

		distToOurGoal=(global.wm.ballPos-g2).mod();

		angToOurGoal=(global.wm.ballPos-g2).ang();

	}

	

	if(global.wm.myNumber==1){
		if((global.wm.nextBallPos - global.wm.nextPos).mod() > 1 &&
			(!global.wm.ballPos.isInOurForbiddenZone()||(global.wm.ballPos.getDistToOurGoal()>10&&opp_ITInfo[oppByITCyc[0]].nCyc<myITCyc-4))) {
			flag=1;
			return false;
		}
	}

	for(i=0;i<11;i++){
		if(i == global.wm.myNumber - 1)
			continue;

		if(myITCyc>our_ITInfo[i].nCyc && !(flag==1&&i==0))
			return false;
	}

	return true;
}



bool Situation::isBallKickable()
{


	Dist dist = (global.wm.myPos-global.wm.ballPos).mod();


	Dist r=-0.01;


//	if(dist<SS->kickDist+SS->ballSize+SS->playerSize)



	//	return true;


	Vector3 nextballPos;


	AgentStatus ballstatus;


	ballstatus.pos=global.wm.ballPos;

	ballstatus.vel=global.wm.ballVel;


	nextballPos=predictor.predictBallStatusAfterNrCycle(ballstatus, 1).pos;

	if(global.wm.collisionFlag)
		nextballPos = global.wm.nextBallPos;

	Vector3 del = (global.wm.nextPos-nextballPos);


//	Vector3 del = (global.wm.nextPos-global.wm.ballPos-global.wm.ballVel);

//    del.z = SS->playerSize-SS->ballSize;


	dist = del.mod();


	Angle ang1 = Normalize((global.wm.nextPos-global.wm.nextBallPos).ang()+180);


	Angle ang2 = global.wm.nextVel.ang();


	if(fabs(Normalize(ang1-ang2))<30||global.wm.nextVel.mod()<0.5)


		r = -0.005;


	if(dist<SS->kickDist+SS->ballSize+SS->playerSize+r)


		return true;


	return false;

}

bool Situation::isBallCatchable()
{
	AgentStatus a,b;
	a.pos=global.wm.nextPos;
	a.vel=global.wm.nextVel;
	b.pos=global.wm.ballPos+global.wm.ballVel;
	b.vel=global.wm.ballVel* SS->B_decay;
	b=predictor.predictBallStatusAfterNrCycle(b, 1);
	if(!b.pos.isInOurForbiddenZone())
		return false;
	if((b.pos-a.pos).mod()>SS->CatchMargin-0.05)
		return false;
	return true;
	

}

void Situation::Init(ServerSettings *ss)
{
	SS = ss;
}

bool Situation::canIPassTo(int number,double &power)
{
	return false;
}

bool Situation::isNearBall()
{
	Vector3 F1,F2,F3;
	if(global.wm.ballVel.mod()>0.1)
		return false;
	if((global.wm.ballPos+global.wm.ballVel-global.wm.nextPos).mod()>0.4)
		return false;
	return predictor.getF1F2F3ReachPoint(global.wm.nextVel, global.wm.nextPos, global.wm.ballPos, F1,F2,F3);
}

bool Situation::isBallInAir()
{

	if(global.wm.ballPos.z>0.11+0.1||fabs(global.wm.ballVel.z)>0.1)

		return true;

	else

		return false;

}



bool Situation::isShootable()



{



	return false;



}







bool Situation::isGoThrough()



{



	return false;



}







bool Situation::canIDribbleTo(const Vector3& dest)



{



	return false;



}



bool Situation::canIReachBallin3Cycs()



{



	Vector3 F1,F2,F3;



	return predictor.getF1F2F3ReachPoint(global.wm.nextVel, global.wm.nextPos, global.wm.ballPos, F1,F2,F3);



}



double Situation::Normal_School(double u, double a,double x)

{

	

	return exp(-1*pow(x-u,2)/(2*pow(a,2)));

}


bool Situation::isDribbleSafe()///////////////add by yzp

{
	int i;

	Vector3 delt(0,0,0);

	Vector3 delt1(0,0,0);

	Vector3 delt2(0,0,0);

	Vector3 goal(0,0,0);
	
	if(global.wm.myPos.x<X(60)){
		
		if(global.wm.myPos.y>0){
			goal.x=SS->mFieldLength/2;
			goal.y=SS->mGoalWidth/4;		
		}else{
			goal.x=SS->mFieldLength/2;
			goal.y=-SS->mGoalWidth/4;	
			
		}
	}
	else
		goal=Vector3(X(98),0,0);


	Angle ang2goal=Normalize((goal-global.wm.myPos).ang());

	Angle ang2ball=Normalize((global.wm.ballPos-global.wm.myPos).ang());


//	if((global.wm.myPos-global.wm.ballPos).mod()>2)
//		return false;
	if(global.wm.myPos.x>SS->mFieldLength/2-12&&fabs(ang2goal)>45)
		goal.x=SS->mFieldLength/2-3;

	ang2goal=Normalize((goal-global.wm.myPos).ang());
	


	Vector3 p0(global.wm.myPos.x+cos(ang2goal/360*2*3.14)*4.8,global.wm.myPos.y+sin(ang2goal/360*2*3.14)*4.8,0);

	Vector3 p1(global.wm.nextPos.x+cos(ang2ball/360*2*3.14)*4.8,global.wm.nextPos.y+sin(ang2ball/360*2*3.14)*4.8,0);


#ifdef WIN32
	ShowCircle(global.wm.myPos.x,global.wm.myPos.y,1.5,"255 0 0 2");

	ShowPie(global.wm.myPos.x,global.wm.myPos.y,1,ang2goal-95,ang2goal+95,"255 100 0 2");

	ShowPie(global.wm.myPos.x,global.wm.myPos.y,1,ang2ball-95,ang2ball+95,"255 100 0 2");

	ShowCircle(p0,0.5,"255 255 0 2");
	
	ShowCircle( p0, 4.8, "255 0 0 2");

	if(fabs(ang2ball)<90)
		ShowCircle( p1, 4.8, "255 255 0 2");

	ShowPie(p0.x,p0.y,5.5,ang2goal-35,ang2goal+35,"255 0 0 2");


	ShowPie(SS->mFieldLength/2+SS->mGoalWidth/4,0,22,135,225,"255 0 200 2");

	Vector3 pp1(SS->mFieldLength/2-12,SS->mFieldWidth/2,0),p2(SS->mFieldLength/2-12,-SS->mFieldWidth/2,0),p3(SS->mFieldLength/2-6,-SS->mFieldWidth/2,0),p4(SS->mFieldLength/2-6,SS->mFieldWidth/2,0);
	
	ShowLine(pp1,p2,"255 0 200 ");

	ShowLine(p3,p4,"255 0 200 ");

	ShowCircle(goal.x,goal.y,0.5,"155 155 155 2");

	ShowCircle(global.wm.nextPos,8,"100 100 0 2");

	ShowCircle(Vector3(X(100),0,0), 6,"100 100 100 2");
#endif
	
	if(global.wm.myPos.x<X(60))
		
		for(i=0;i<11;i++){
			
			delt = global.wm.oppPos[i]-p0;
			
			delt1=global.wm.oppPos[i]-p1;
			
			delt2 = global.wm.oppPos[i]-global.wm.myPos;
			if(delt.mod()<=4.8)
				return false;
			//////////////////////////yzp0429
			else if(delt.mod()<=5.5&&fabs(Normalize(delt.ang()-ang2goal))<30)
				return false;
			/////////////
			else if(delt2.mod()<1&&fabs(Normalize(delt.ang()-ang2ball))<105)
				return false;
			
			else if(delt1.mod()<=4.8&&fabs(ang2ball)<90)
				return false;
		}

	else
		for(i=0;i<11;i++){
			
			delt = global.wm.oppPos[i]-p0;
			
			delt1=global.wm.oppPos[i]-p1;
			
			delt2 = global.wm.oppPos[i]-global.wm.myPos;
			
			if(delt.mod()<=5.5&&fabs(Normalize(delt.ang()-ang2goal))<30)
				return false;
			
			else if(delt1.mod()<=4.8)
				return false;
		}

	if((p1-global.wm.oppPos[0]).mod()<6)
		return false;

	return true;

}



bool Situation::isSomeOppBlocking(Vector3 ball, Angle ang, Angle &goover)



{







	Vector3 delt;



	delt = global.wm.oppPos[oppByITCyc[0]]-ball;



	Angle theta;



	Dist dist;



	dist = delt.mod();



	



	if(dist<5){



		if(dist<0.401)



			dist = 0.401;



		theta = asin(0.4/dist) * 180. / PI;



		



		if(fabs(Normalize(delt.ang()-ang))<theta){



			goover = atan(1.0/dist) * 180. / PI;



			if(goover>50)



				goover=50;



			return true;



		}



	}



	return false;



}



bool Situation::isDeadBall()



{



	if(global.wm.pm != PM_PlayOn && global.wm.pm != PM_GOAL_KICK_Our ||global.wm.mSensationCount<2)



		return true;



	return false;



}



bool Situation::isBallBeingInOppControl()



{



	if(opp_ITInfo[oppByITCyc[0]].nCyc >=4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc >= 4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc > 6



		)



		return true;



	return false;



}



bool Situation::isBallBeingInOurControl()



{



	if(opp_ITInfo[oppByITCyc[0]].nCyc >=4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc >= 4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc < -6



		)



		return true;



	return false;



}







bool Situation::isBallBeingInBothControl()



{



	if(opp_ITInfo[oppByITCyc[0]].nCyc >=4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc >= 4



		&&



		our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc >= -6



		&&



		our_ITInfo[ourByITCyc[0]].nCyc - opp_ITInfo[oppByITCyc[0]].nCyc <= 6



		)



		return true;



	return false;



}







bool Situation::isBallInBothControl()



{



	if((opp_ITInfo[oppByITCyc[0]].nCyc <4||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)



		&&



		(our_ITInfo[ourByITCyc[0]].nCyc <4||our_ITInfo[ourByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)



		)



		return true;



	return false;



}



bool Situation::isBallInOppControl()



{



	if((opp_ITInfo[oppByITCyc[0]].nCyc <4||opp_ITInfo[oppByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)



		&&



		!(our_ITInfo[ourByITCyc[0]].nCyc <4||our_ITInfo[ourByDist2Ball[0]].dDist2Ball < SS->ballSize+SS->playerSize + 0.1)



		)



		return true;



	return false;



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -