📄 strategy.cpp
字号:
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 + -