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

📄 situation.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(p.x>X(90)&&fabs(p.y)>30)

	{

		double tmp=(p.x-X(90)+fabs(p.y)-30)*1.5;

		v-=Vector3(tmp,tmp,tmp);

	}

	return v;

		}

	

	else{////////////////add by yzp



	int i=0;

	

	Vector3 v;

	

	int oppnear=0;



	int ournear=0;



	double temp=0;



	Vector3 goal;



	if(p.y>0){

		

		goal.x=SS->mFieldLength/2;

		

		goal.y=SS->mGoalWidth/4;

		

		}else{

		

		goal.x=SS->mFieldLength/2;



		goal.y=-SS->mGoalWidth/4;	



		}



	double DistMinOpp=(p-global.wm.oppPos[i]).mod();



	double DistMinOur=(p-global.wm.ourPos[i]).mod();



	double p2goal=(p-goal).mod();

	

	for(i=1;i<11;i++){



		temp=(p-global.wm.oppPos[i]-global.wm.oppVel[i]/3.0).mod();



		if(temp<DistMinOpp){



			DistMinOpp=temp;



			oppnear=i;

		}

			

	}

	//

	if((global.wm.oppPos[oppnear] - Vector3(X(100)-10,0)).mod() < (p - Vector3(X(100)-10,0)).mod())

		DistMinOpp-=1;

	

	//	

	for(i=1;i<11;i++){



		if(i+1==global.wm.myNumber)

			continue;

		temp=(p-global.wm.ourPos[i]).mod();



		if(temp<DistMinOur){

			DistMinOur=temp;

			ournear=i;



		}

	}



	Angle ang=Normalize((goal-p).ang());

	double midDist=(global.wm.ourPos[ournear]-global.wm.oppPos[oppnear]).mod()/2;

	/////////////////////yzp0607

	double dist_me2p=(p-global.wm.nextPos).mod();

	double dist_p2goal=(p-goal).mod();

	double dist_total=dist_me2p+dist_p2goal;

	double dist_me2goal=(global.wm.nextPos-goal).mod();

	double co_ang=1;

	if(fabs(ang)>45&&p.x>X(75))
		co_ang=Normal_School(45,20,fabs(ang));///////////////yzp0609
	

	/////////////////////////yzp0605

	if(DistMinOur<DistMinOpp+1&&DistMinOur>DistMinOpp+0.5)
		v.z=20*Normal_School(13.0,  15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
	if(DistMinOur<DistMinOpp+0.5&&DistMinOur>DistMinOpp)
		v.z=30.0*Normal_School(13.0,  15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
	else if(DistMinOur<=DistMinOpp&&DistMinOur>=DistMinOpp-1.0)
		v.z=40*Normal_School(13.0,  15.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang;
	else if(DistMinOur<DistMinOpp-1.0)
		v.z=90*Normal_School(13.0,  19.0, p2goal)*Normal_School(1, 1, dist_total/dist_me2goal)*co_ang+10*Normal_School(0,midDist-2,DistMinOur);
	else 
		v.z=0;


	return v;
	}
}


void Situation::getConsiderPassPoint(vector<Vector3>& points, double maxDis)
{
	if (maxDis < 0) maxDis = 25;

	int i;
	Vector3 p;
	Angle ang,angmax,angmin;
	Dist dist;
	Vector3 goal(X(100),0);
	angmax=100;angmin=-100;

	for(i=0;i<11;i++){
		if(i==global.wm.myNumber-1)
			continue;
		if(global.wm.ourPos[i].x+1<global.wm.myPos.x
			|| (global.wm.ourPos[i] - global.wm.myPos).mod() > maxDis)
			continue;

		Angle angtogoal=(goal-global.wm.ourPos[i]).ang();
		if(fabs(angtogoal)>60) {
			angmax=	angtogoal+90;
			angmin=angtogoal-90;
		}

		for(ang=angmin;ang<=angmax;ang+=10){
			for(dist=2;dist<9;dist+=1){
				p = global.wm.ourPos[i] + Vector3(dist,ang,0,POLAR);
				points.push_back(p);
#ifdef WIN32
				ShowCircle(p.x,p.y,0.111,"128 255 255 2");
#endif
			}
		}
	}

	if(global.wm.ballPos.getDistToOppGoal()<25) {
		if(global.wm.ballPos.y>0)
			  p = Vector3(X(101),SS->mGoalWidth/4,0);
		else  p = Vector3(X(101),-SS->mGoalWidth/4,0);
		points.push_back(p);
#ifdef WIN32
		ShowCircle(p.x,p.y,0.111,"128 255 255 2");
#endif
	}
}

Vector3 Situation::getBestPassPoint(double maxDis)
{
	vector<Vector3> points;
	getConsiderPassPoint(points, maxDis);
	int i;
	double maxV=-1;
	Vector3 best = Vector3(X(105), 0, 0);
	double dTmp;

	if((global.wm.myPos-best).mod()<15&&fabs(Normalize((best-global.wm.myPos).ang()))<60)
		return best;///////////////

	for(i=0;i<(int)points.size();++i){
		Vector3 vTmp=EvaluatePassPoint(points[i]);
		dTmp = vTmp.z;
		if(dTmp>maxV){
			maxV=dTmp;
			best = points[i];
		}
	}

#ifdef WIN32
	ShowCircle(best.x,best.y,0.5,"255 128 255 2");
#endif
	return best;
}


bool Situation::shouldIKickOff()
{

	if(global.wm.myNumber==1){
		return false;
	}

	int mynCyc = our_ITInfo[global.wm.myNumber-1].nCyc;



	double myDist = our_ITInfo[global.wm.myNumber-1].dDist2Ball;



	for(int i=1;i<11;i++){				// 鲁媒脕脣脢脴脙脜脭卤脰庐脥芒碌脛脟貌脭卤



		if(i == global.wm.myNumber - 1)



			continue;



		if(mynCyc > our_ITInfo[i].nCyc)



			return false;



		if(mynCyc==our_ITInfo[i].nCyc && myDist>our_ITInfo[i].dDist2Ball)



			return false;



	}







	return true;



}


int Situation::getKickPower(Vector3 destPos, double &theta, double &power) //add by zy
{
	Vector3 vecBallToBall = destPos-(global.wm.ballPos+global.wm.ballVel);	//from next ball position to destination

	double passDistance =vecBallToBall.mod()*1.1;

	double minAirDistance_s = -1;

	int nOppInSector = 0;

	int nOppClose = 0;

	int possibility = 0;

	bool noDest = 0;

	if(passDistance>30) {

		passDistance=25;

		noDest = 1;
	}

#ifdef WIN32
	Vector3 ball(global.wm.ballPos.x+global.wm.ballVel.x,global.wm.ballPos.y+global.wm.ballVel.y);

	double kick_ang = vecBallToBall.ang();

	ShowPie(ball.x,ball.y,15,kick_ang-20,kick_ang+20,"128 0 255 2");

	ShowPie(ball.x,ball.y,5.0,kick_ang-30,kick_ang+30,"128 0 255 2");

	ShowPie(ball.x,ball.y,2.0,kick_ang-50,kick_ang+50,"128 0 255 2");

	ShowMessage("passDis: %lf",passDistance);

#endif
	// is too long to pass ?
//	if(passDistance>MAX_PASS_DISTANCE && noDest == 0)
//		return 0;

	// need longball ? 
	// number of opp in the area who can intercept
	// number of opp on the line
	for(int i=0;i<11;i++) {

		Vector3 ball(global.wm.ballPos.x+global.wm.ballVel.x,global.wm.ballPos.y+global.wm.ballVel.y);

		Vector3 vecBallToOpp(global.wm.oppPos[i].x-ball.x,global.wm.oppPos[i].y-ball.y);

		Vector3 vecBallToOur(global.wm.ourPos[i].x-ball.x,global.wm.ourPos[i].y-ball.y);

		if(i==global.wm.myNumber-1)
			vecBallToOur.x=vecBallToOur.y=1000;

		double dd=passDistance;

		if(dd>15)  dd=15;

		if(isInSector(vecBallToBall,vecBallToOpp,20,dd)||isInSector(vecBallToBall,vecBallToOpp,30,5.0)
			||isInSector(vecBallToBall,vecBallToOpp,50,2.0))
		{
			nOppInSector++;

			if(vecBallToOpp.mod()>minAirDistance_s)

				minAirDistance_s=vecBallToOpp.mod();

			if(isInSector(vecBallToBall,vecBallToOpp,45,1.0))

				nOppClose++;
		}

	
		if(isInSector(vecBallToBall, vecBallToOur,45, 5.0))
		{
			if(vecBallToOur.mod()>minAirDistance_s)

				minAirDistance_s=vecBallToOur.mod();
		}
	}
	// cannot get a satisfying destination

	if(noDest==1) {

		if(nOppInSector==0) {

			theta=0; power=100;

			return 75;
		}
		else {

			theta=30; power=100;

			return 75;
		}

		return possibility;

	}

	// no opp -- short pass
	if(nOppInSector==0) {	

		theta=0;

		power=(passDistance+0.4316)/0.2456;

		return 100;
	}

	//long pass

	if(minAirDistance_s>MAX_AIR_DISTANCE) {

		theta=30;

		power=100;

		if(minAirDistance_s-MAX_AIR_DISTANCE<ALARM) {

			possibility=50;

		} else {

			possibility=0;
		}

		return possibility;

	} else {

		possibility=0;

		int flag = 0;

		int min_index = 7;

		for(int i=0;i<8;i++) {

			int index = 7-i;

			theta=coef_dis[index][0];

			if(nOppClose)
			{
							
				if(theta<30)
					
					break;
				
				if( theta<45)

					continue;

			}
			
			power=(passDistance-coef_dis[index][4])/coef_dis[index][3];

			if(power>100||power<0)

				continue;

			double firstDis = coef_dis[index][1]*power+coef_dis[index][2];

			if(firstDis-minAirDistance_s<0.5) {

				if(minAirDistance_s-firstDis<ALARM) {

					possibility=50;
				}else {

					possibility=0;
				}

				break;

			}

			else {

				flag = 1;

				min_index=index;

				break;
			}

		}

		if(flag==1) {

			possibility = 100;

			theta=coef_dis[min_index][0];

			power=(passDistance-coef_dis[min_index][4])/coef_dis[min_index][3];

		} else if(possibility==0 && nOppClose) {

			possibility=25;

			theta=50;

			power=100;

		}

		return possibility;

	}

}



bool Situation::shouldIDribble(bool isShoot)/////////////add by yzp

{
	Vector3 goal(0,0,0);

	Vector3 midgoal(X(100),0,0);

	Vector3 pos = getWhereToKickTo();

	bool ShouldIPass=false;

	bool dribbleForward=true;

	bool inCorner=false;

	Vector3 delt;

	if(pos.z>40)
		ShouldIPass=true;

	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 ang2ball=Normalize((global.wm.ballPos-global.wm.myPos).ang());
	
		Angle ang2goal=Normalize((goal-global.wm.myPos).ang());

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

		if(global.wm.myPos.x>SS->mFieldLength/2-12&&global.wm.myPos.x<X(98)&&fabs(ang2goal)>45)
			goal.x=SS->mFieldLength/2-3;
		////////////////////yzp0501
		else if(global.wm.myPos.x>=X(98)&&fabs(global.wm.myPos.y)>=Y(98)){
			goal.x=X(40);
			inCorner=true;
			}

		ang2goal=Normalize((goal-global.wm.myPos).ang());
		
		Angle angmid=(midgoal-global.wm.myPos).ang();
		
	if(global.wm.myPos.x<=SS->mFieldLength/2-16){////////////yzp0609
		if(fabs(Normalize(ahead-ang2goal))>30&&fabs(Normalize(ahead-angmid))>30)
			return false;
		}
	else if(global.wm.myPos.x>=SS->mFieldLength/2-3){
		if(fabs(Normalize(ahead-ang2goal))>5)
			return false;
		}
	else if(fabs(Normalize(ahead-ang2goal))>10&&fabs(Normalize(ahead-angmid))>10&&!isShoot)
			return false;
		

	for(int i=0;i<11;i++){
		/////////////////////////yzp0429
		delt = global.wm.oppPos[i]-global.wm.nextPos;

		if(fabs(Normalize(delt.ang()-ang2goal))<15&&delt.mod()<12||(global.wm.nextPos-goal).mod()<=12){
			dribbleForward=false;
			break;
			}
	}
	////////////////////yzp0501
	if(inCorner){
		dribbleForward=false;
		ShouldIPass=false;
		}
	#ifdef WIN32
		ShowPie(global.wm.myPos.x, global.wm.myPos.y, 12, ang2goal-15, ang2goal+15, "255 0 255 2");
	#endif
	

	if(dribbleForward)
		return true;

	if(isShoot||ShouldIPass)
			return false;	
	
	return true;


}





bool Situation::shouldITurn(bool isShoot)////////add by yzp

{



	if(isShoot)

		return false;



	bool turn=true;

	

	for(int i=0;i<11;i++){



		if((global.wm.oppPos[i]-global.wm.myPos).mod()>1.5)



			continue;



		turn=false;



		}



		return turn;



}


Vector3 Situation::passToMid()
{
	Vector3 goal(0,0,0);

	Vector3 goal1(X(100),SS->mGoalWidth/4,0);

	Vector3 goal2(X(100),-SS->mGoalWidth/4,0);

	Vector3 p;
	
	Vector3 best;
	
	Angle ang2goal;

	double maxv=0;

	Vector3 p_nearest(X(100),Y(0),0);

	double v=0;

	Vector3 myPos=global.wm.nextPos;

	for(int i=6;i<11;i++){
		
		if(global.wm.myNumber==i+1)
			continue;
		if(global.wm.ourPos[i].y>0)
			goal=goal1;
		else
			goal=goal2;
		ang2goal=(goal-global.wm.ourPos[i]).ang();
		
		if(i>=8){/////////////yzp0608
			
			for(Angle ang=-20;ang<=20;ang+=10){				
				
				p.x=global.wm.ourPos[i].x+cos((ang2goal+ang)/360*2*3.14)*1.5;
				p.y=global.wm.ourPos[i].y+sin((ang2goal+ang)/360*2*3.14)*1.5;
				
				if(p.x>SS->mFieldLength/2-0.5){
					p.x=global.wm.ourPos[i].x+cos((ang2goal+ang)/360*2*3.14)*0.5;
					p.y=global.wm.ourPos[i].y+sin((ang2goal+ang)/360*2*3.14)*0.5;
				}
				
				
				if((p-myPos).mod()<(p_nearest-myPos).mod())
					p_nearest=p;
				
				if((p-global.wm.myPos).mod()>25)
					continue;
				
				v=EvaluatePosVal(p).z;
				
				if(v>maxv){
					maxv=v;
					best=p;
				}
				
		#ifdef WIN32
				ShowCircle(p, 0.5, "200 200 200 2");
		#endif 
				
			}
		}
		else{
			p.x=global.wm.ourPos[i].x+cos(ang2goal/360*2*3.14)*2;
			p.y=global.wm.ourPos[i].y+sin(ang2goal/360*2*3.14)*2;
		
		if(p.x>SS->mFieldLength/2-0.5){
			p.x=global.wm.ourPos[i].x+cos(ang2goal/360*2*3.14)*0.5;
			p.y=global.wm.ourPos[i].y+sin(ang2goal/360*2*3.14)*0.5;
			}
		
		
		if((p-myPos).mod()<(p_nearest-myPos).mod())
			p_nearest=p;
		
		if((p-global.wm.myPos).mod()>25)
			continue;

		v=EvaluatePosVal(p).z;

		if(v>maxv){
			maxv=v;
			best=p;
		}

		#ifdef WIN32
			ShowCircle(p, 0.5, "200 200 200 2");
		#endif

		}
		}
		#ifdef WIN32
			ShowCircle(best, 0.3, "0 200 200 2");
		#endif
/*
	if(maxv<40)
		return goal;
	else
		return best;
*/
	//////////////////yzp0501

⌨️ 快捷键说明

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