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

📄 strategy.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	double Strategy::getY(int num,double ballY,double ballX)

	{

		int i,j;

		double ghostY,y ;


		ghostY=getGhostY(num, ballX,ballY);

		i=getI(num);

		if(i==4)

			return ghostY;

		j=getJ(num);

		y=PolarY(dist[i][j],theta[i][j]);

		y=ghostY+y;

 		return y;

		}

///////////////////////////OriginalFormation


void Strategy::AddDebugMessage(const char *str, ...)

{

	char buf[800];

	va_list ap;

	va_start( ap, str );

	vsprintf( buf, str, ap );

	va_end(ap);

	m_DebugMessage += buf;

}



/////////////////Positioning///////////////////add by yzp

Vector3 Strategy::getBestPassPoint(Vector3 pos)

{
	
	vector<Vector3> points;

	getConsiderPassPoint(points,pos,8,25);

	int i;

	double maxV=-1;

	Vector3 best = Vector3(X(90), 0, 0);

	double dTmp;

	for(i=0;i<(int)points.size();++i){

		Vector3 vTmp=ST->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;

}

Vector3 Strategy::getBestRunPoint(Vector3 pos)
{

	
	
	vector<Vector3> points;

	Vector3 best=global.wm.myPos;

	double maxRun=EvaluateRunPoint(global.wm.myPos);

	double dTmp;
	
	int i;
	
	getConsiderPassPoint( points, global.wm.myPos,4,10);

	for(i=0;i<(int)points.size();++i){

		double runTmp=EvaluateRunPoint(points[i]);

		dTmp = runTmp;
			
		if(dTmp>maxRun){

			maxRun=dTmp;

			best = points[i];

		}

	}
	
	return best;
	
}


Vector3 Strategy::getAreaPoint(Vector3 point)
{
		int count=6;

	int i=0;

	double start_x=SS->mFieldLength/2;

	double end_x=-10;

	double start_y=SS->mFieldWidth/2;

	double end_y=-SS->mFieldWidth/2;

	if(start_x>=point.x&&end_x<=point.x){
		
		
		for(i=0;i<count;i++){
			
			(start_x+end_x)/2>=point.x?(start_x=(start_x+end_x)/2):(end_x=(start_x+end_x)/2);
			
		}
		
		for(i=0;i<count;i++){
			
			(start_y+end_y)/2>=point.y?(start_y=(start_y+end_y)/2):(end_y=(start_y+end_y)/2);
			
		}
		
		point.x=start_x;
		
		point.y=(start_y+end_y)/2;
		
	}
	return point;

}





double Strategy::EvaluateRunPoint(Vector3 point)
{	
	
	
	Vector3 bestPassPoint=getBestPassPoint(point);
	
	double holdBack=0;	
	
	double displacement=0;

	double offense=0;

	offense=EvalOffense(bestPassPoint);

	holdBack=EvalHB(bestPassPoint);
	
	double val=holdBack+offense;

	return val;
}



double Strategy::EvalHB(Vector3 point)
{
	

	int i=0;

	int oppnear=0;

	int ournear=0;
	
	double dTmpOpp=0;

	double dTmpOur=0;

	double holdback=0;

	double oppPos=0;
	
	double distMinOur=(global.wm.ourPos[i]-global.wm.ballPos).mod();

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

		dTmpOur=(global.wm.ourPos[i]-global.wm.ballPos).mod();

		if(dTmpOur<distMinOur){
			distMinOur=dTmpOur;
			ournear=i;
		}

	}
	
	i=0;

	Vector3 ourPoint=getAreaPoint(global.wm.ourPos[ournear]);
	
	double distMinOpp=((global.wm.oppPos[i]-point).mod()+(ourPoint-global.wm.oppPos[i]).mod());

	for(i=1;i<11;i++){
		
		dTmpOpp=((global.wm.oppPos[i]-point).mod()+(ourPoint-global.wm.oppPos[i]).mod());

		if(dTmpOpp<distMinOpp){

			distMinOpp= dTmpOpp;
			oppnear=i;
		}


	}

	double passDist=EvalDist(point, ourPoint,15.0,5.0);

//	double oppDist=EvalDist(point,global.wm.oppPos[oppnear],(point-global.wm.myPos).mod(),2);

	
		//find the nearest opp  and the nearest ours away from the ball 
	if((global.wm.oppPos[oppnear]-global.wm.ourPos[ournear]).mod()>(point-global.wm.ourPos[ournear]).mod())
		holdback=10;
	else
		holdback=distMinOpp/(point-global.wm.ourPos[ournear]).mod();
	
	return holdback*passDist; 
		
}



double Strategy::EvalDist(Vector3 point,Vector3 goalpoint,double u,double a)
{
	
	
	double pDist=(point-goalpoint).mod();

	return Normal_School(u, a, pDist);
}



double Strategy::EvalOffense(Vector3 point)
{

	
	
	Vector3 goalpoint1(SS->mFieldLength/2,SS->mGoalWidth/4,0);
	
	Vector3 goalpoint2(SS->mFieldLength/2,SS->mGoalWidth/4*(-1),0);

	Vector3 goalpoint;

	(goalpoint1-point).mod()>(goalpoint2-point).mod()?goalpoint=goalpoint2:goalpoint=goalpoint1;

	int i=0;

	double offense=0;

	int oppnear=0;

	int ournear=0;
	
	double dTmpOpp=0;

	double distMinOpp=(global.wm.oppPos[i]-point).mod()+(goalpoint-global.wm.oppPos[i]).mod();

	for(i=0;i<11;i++){
		
		dTmpOpp=(global.wm.oppPos[i]-point).mod()+(goalpoint-global.wm.oppPos[i]).mod();

		if(dTmpOpp<distMinOpp){

			distMinOpp= dTmpOpp;
			oppnear=i;
		}
	}

	double passDist=EvalDist(point, goalpoint,18.0,5.0);

	if((global.wm.oppPos[oppnear]-goalpoint).mod()>(point-goalpoint).mod())
		offense=10;
	else
		offense=distMinOpp/(point-goalpoint).mod();

	return offense*passDist;

}



void Strategy::getConsiderPassPoint(vector<Vector3>& points,Vector3 p_Center,Dist distance,int t_ang)

{

	
	Vector3 p;

	Angle ang,angmax,angmin;

	Dist dist;

	Vector3 goal(X(100),0);

	angmax=100;angmin=-100;


		Angle angtogoal=(goal-p_Center).ang();

		if(fabs(angtogoal)>60)
		{
			angmax=	angtogoal+90;

			angmin=angtogoal-90;
		}

		for(ang=angmin;ang<=angmax;ang+=t_ang){

			for(dist=2;dist<distance;dist+=1){

				p = p_Center+ Vector3(dist,ang,0,POLAR);

				points.push_back(p);

				#ifdef WIN32

				ShowCircle(p.x,p.y,0.111,"128 255 255 2");

				#endif

			}

		}

}

///////////////////////////

double Strategy::Normal_School(double u, double a,double x)
{
	
	return exp(-1*pow(x-u,2)/(2*pow(a,2)));
}



double Strategy::Normal_School_2D(double u1, double u2, double a1, double a2, double x, double y,double rou)
{
	return exp(-1/(2*(1-pow(rou,2)))*(pow(x-u1,2)/pow(a1,2)-2*rou*(x-u1)*(y-u2)/(a1*a2)+pow(y-u2,2)/pow(a2,2)));
}




/////////////////////// PositionSet/////////////////////add by yzp

Vector3 Strategy::getPosition(int player,double x_Ball,double y_Ball)
{
	Vector3 pos;
	CBpline Qu;
	double Fieldlength=SS->mFieldLength;
	double u=(x_Ball+Fieldlength/2)/Fieldlength*position_cp.CpNum[player-1]+1.1;
	int m=0;
	for(m=0;m<position_cp.CpNum[player-1];m++)
	{	
		tempCP[m]=position_cp.CP[player-1][m];
	}
	if(m!=0)
	{
		tempCP[m]=position_cp.CP[player-1][m-1];
		tempCP[m+1]=position_cp.CP[player-1][m-1];
	}
	if(position_cp.CpNum[player-1]!=0)
	{
		pos.x=Qu.Qu(u,position_cp.CpNum[player-1],tempCP,position_cp.weight[player-1]).x;
		pos.y=Qu.Qu(u,position_cp.CpNum[player-1],tempCP,position_cp.weight[player-1]).y+getYShift(y_Ball);
		pos.z=0.22;
		return pos;
	}
	else{
		pos.x=getX( player, global.wm.ballPos.x, global.wm.ballPos.y);

		pos.y=getY( player, global.wm.ballPos.x, global.wm.ballPos.y);

		return pos;
	}
		
}



double Strategy::getYShift(double y_Ball)
{	
	double Yshift;
	CBpline Qu;
	double FieldWide=SS->mFieldWidth;
	
	for(int n=0;n<8;n++)
	{
		if(n<6)
		{
			Y_CP[n].y=n*2;
			Y_CP[n].x=0;
		}
		else{
			Y_CP[n].x=12;
			Y_CP[n].y=12;
		}
		Y_weight[n]=1;
	}
	double u;
	
	if(y_Ball>=0)
	{
		 u=y_Ball/(FieldWide/2)*6+1.1;
		 Yshift=Qu.Qu(u,6,Y_CP,Y_weight).y;
		 return Yshift;
	}
	else
	{
		u=-1*y_Ball/(FieldWide/2)*6+1.1;
		Yshift=Qu.Qu(u,6,Y_CP,Y_weight).y;	
		return -Yshift;
	}

}


void ControlPoint::GetPositionCP()
{
	ifstream in("Position_CP.pos");
	string line;
//	cerr<<"GetPositionCP"<<endl;
	int n;
	float x, y;
	int w;
	
	for(int j=0;j<15;j++)
		for(int k=0;k<50;k++)
			weight[j][k]=1;
		
	while (getline(in, line)) {
		
		sscanf(line.data(), "(Player %d): [%f,%f,%d]", &n, &x, &y,&w);

		cerr<<x<<endl;
		CP[n-1][CpNum[n-1]].x=x;
		CP[n-1][CpNum[n-1]].y=y;
		weight[n-1][CpNum[n-1]]=w;
		CpNum[n-1]++;		
	}


	
}
/////////////////////// PositionSet/////////////////////////

/////////////////////////BSpline/////////////////add by yzp

CBpline::CBpline()
{
	Def_k=2;
	num_points=50;
	GetT(20);
}
CBpline::~CBpline()
{
	delete []T;
}

float CBpline::N(double u,int i,int k)
{
	float a;
	
	if(k==0)
	{
		if(u>=T[i-1]&&u<=T[i])
			return 1;
		else 
			return 0;
	}
	else 
		return a=(u-T[i-1])*N(u,i,k-1)/(T[i-1+k]-T[i-1])+(T[i+k]-u)*N(u,i+1,k-1)/(T[i+k]-T[i]);
  //N(u)=(u-t(i))*N(u,i,k-1,t)/(t(i+k)-t(i))+(t(i+k+1)-u)*N(u,i+1,k-1,t)/(t(i+k+1)-t(i+1));

}

Vector3 CBpline::Qu(double u, int n, Vector3 * CP, double * weight)
{

	Vector3 Q;
	double Qx=0,Qy=0;
	double Q_den=0;
	int k=Def_k;

	for(int j=0;j<n+2;j++)
	{	
		
		Qx+=CP[j].x*N(u,j,k)*weight[j];
		Qy+=CP[j].y*N(u,j,k)*weight[j];	//Qu=sigema B(i)*Nu(i)*weight(i)
		Q_den+=N(u,j,k)*weight[j];		//Q_den=sigema Nu(i)*weight(i)	
	}

	Q.x=Qx/Q_den;
	Q.y=Qy/Q_den;

	return Q;
}

void CBpline::GetT(int n)
{
	int k=Def_k;
		T=new float[n+k+1];
		
	for(int j=0;j<n+k+1;j++)
	{
		T[j]=(float)(j+1);
	}
}


///////////////////////////Bspline///////////////////

⌨️ 快捷键说明

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