📄 communicate.cpp
字号:
}
else
{
switch(Info.where)
{
case left:
{
if(Info.IsForwardOutSide)
{
BasicAct(0,0,1,-7*MAX_VELOCITY/8,time);
return;
}
BasicAct(0,0,1,7*MAX_VELOCITY/8,time);
break;
}
case right:
{
if(Info.IsForwardOutSide)
{
BasicAct(0,0,1,-7*MAX_VELOCITY/8,time);
return;
}
BasicAct(0,0,1,7*MAX_VELOCITY/8,time);
break;
}
case top:
{
if(Info.IsForwardOutSide)
{
BasicAct(0,0,1,-7*MAX_VELOCITY/8,time);
return;
}
BasicAct(0,0,1,7*MAX_VELOCITY/8,time);
break;
}
case bottom:
{
if(Info.IsForwardOutSide)
{
BasicAct(0,0,1,-7*MAX_VELOCITY/8,time);
return;
}
BasicAct(0,0,1,7*MAX_VELOCITY/8,time);
break;
}
}
}
}
*/
/*
BOOL Player::PtInRect(CRect r, CPoint p)
{
return ((p.x-r.left)*(p.x-r.right)<=0)&&((p.y-r.bottom)*(p.y-r.top)<=0);
}
*/
/*
void Player::RealShoot(double dist)
{
double A1,B1,C1;
double A2,B2,C2;
Vector left_goal=Vector(FieldStruct.m_TheirGoal.x,FieldStruct.m_TheirGoal.y-FieldStruct.Goal_Width/2);
Vector right_goal=Vector(FieldStruct.m_TheirGoal.x,FieldStruct.m_TheirGoal.y+FieldStruct.Goal_Width/2);
static unsigned int depth2=1;
Vector a=Vector((this->m_vPos).x-g_Ball.m_vPos.x,(this->m_vPos).y-g_Ball.m_vPos.y);
g_Ball.Get_vPos().LineFromTwoPoint(A1,B1,C1,left_goal);
g_Ball.Get_vPos().LineFromTwoPoint(A2,B2,C2,right_goal);
if(((A1*g_Ball.Get_vPos().x+B1*g_Ball.Get_vPos().y+C1)*(A1*FieldStruct.m_TheirGoal.x+B1*FieldStruct.m_TheirGoal.y+C1))<0 &&
((A2*g_Ball.Get_vPos().x+B2*g_Ball.Get_vPos().y+C2)*(A2*FieldStruct.m_TheirGoal.x+B2*FieldStruct.m_TheirGoal.y+C2))<0 &&
(this->m_vPos).dist(g_Ball.Get_vPos())<dist)
{
BasicAct(0,0,0,0);
TurnTo(g_Ball.Get_vPos());
BasicAct(0,0,1,MAX_VELOCITY);
SetMMTimer(1000,DWORD(this),MMProc_Stop);
}
if(a.mod()>20 && depth2<40)
{
depth2++;
CVideoDlg::m_pVideoDlg->OnRead();
CVideoDlg::m_pVideoDlg->SearchObject();
TurnTo(g_Ball.Get_vPos());
// MoveTo4Debug(g_Ball.Get_vPos()+dist*g_Ball.Get_vPos()/g_Ball.Get_vPos().mod())
/* fprintf(Player::pFile,"TurnAngle4Debug stop at %u ms\n",GetTickCount()-timestart);
// WaitForSingleObject(basicact,2000);
// fprintf(Player::pFile,"after Waitforsingleobject stop at %u ms\n",GetTickCount()-timestart);
BasicAct(0,0,1,7*MAX_VELOCITY/8);
fprintf(Player::pFile,"Shoot4debug before settimer %u ms\n",GetTickCount()-timestart);
SetTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_SHOOT,800,TimerProc);
// Sleep(1000);
}
else
{
fprintf(Player::pFile,"depth2=%u shoot4Debug else complete\n",depth2);
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_SHOOT);
BasicAct(0,0,0,0);
}
depth2=1;
return;
}
BOOL Player::TurnTo4Debug(Vector dest)//返回值代表的并不是是否已经转到
{
unsigned long t;
t=GetTickCount()-timestart;
static short num=0;
num++;
Vector a=Vector((dest.x-this->m_vPos.x),(dest.y-this->m_vPos.y));
double angle;//角度值
angle=a.GetAngle()-(this->Get_m_Angle());//两个角度差值
fprintf(pFile,"--TurnTo4Debug start at %u-- dest(ball position) is(%2f,%2f),g_MyTeam[%d]pos=(%2f,%2f) g_MyTeam[%d]Angle=%2f,angle=%2f,num=%d\n",t,dest.x,dest.y,this->Get_Num(),this->Get_vPos().x,this->Get_vPos().y,this->Get_Num(),this->Get_m_Angle(),angle,num);
static unsigned depth=1;
if (depth>CDebugDlg::m_pDebugDlg->m_times)//三次转不到则放弃,并返回false
{
// fprintf(pFile,"---------------------------depth>3-----------------------");
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_TIMER);
BasicAct(0,0,0,0);
depth=1;
// fprintf(pFile,"\n--------------------returned with false\n\n\n");
return FALSE;
}
else
{
// fprintf(pFile,"\n------------------------------depth<=3------------------------\n");
depth++;
if(fabs(angle)<20)//认为已经转到,停止转动并返回
{
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_TIMER);
BasicAct(0,TRUE,TRUE,0);
// fprintf(pFile,"\n*******************returned of true\n\n\n");
depth=0;
return TRUE;
}
if(angle>0)
angle=((int)angle%360>180)?(int)angle%360-360:(int)angle%360;
if(angle<0)
angle=((int)(-angle)%360>180)?(int)angle%360+360:(int)angle%360;
double V=(fabs(angle)>90) ? 0.8*MAX_VELOCITY:0.8*(2*MAX_VELOCITY/3);//若大于90度,全速,否则3/4全速
t=GetTickCount()-timestart;
// fprintf(pFile,"\n--time before send command is %u--\ndepth=%d,V=%2f\n",t,depth,V);
SetMMTimer((unsigned) fabs(angle)/2,ID_TIMER,MMProc_Stop);//
BasicAct(0,(BOOL)(angle>0),FALSE,V);//若Angle<0,则依右手定则
// fprintf(pFile,"\n---Time of send command(time of settimer) is %u----\n",GetTickCount()-t-timestart);
//--------------------------------------
unsigned long t;
t=GetTickCount()-timestart;
fprintf(Player::pFile,"vision start at %u\n",t);
CVideoDlg::m_pVideoDlg->OnRead();
CVideoDlg::m_pVideoDlg->SearchObject();
fprintf(pFile,"vision last %u\n",GetTickCount()-timestart-t);
//---------------------------------------
fprintf(pFile,"\n\n----------------end of depth<3------------------\n\n ");
}
depth=1;
return FALSE;
}
*/
/*
int Player::EAPFMove( Vector &goal )
{
CDebugDlg::m_pDebugDlg->UpdateData(1);
// FILE *pFile=fopen("pos.txt","a+");
Vector v = Get_vPos();
if( v == goal )
return 0;
Vector vObs = g_MyTeam[0].Get_vPos();
Vector vTemp = goal;
// fprintf( pFile, "\n-------------------------------------\n" );
// fprintf( pFile, "%lf\n%lf\n", v.x, v.y );
// fprintf( pFile, "%lf\n%lf\n", goal.x, goal.y );
// fprintf( pFile, "%lf\n%lf\n", vObs.x, vObs.y );
double DisRG;
DisRG = (v - vTemp).mod();//机器人与目标点的距离
double DisRO = ( v - vObs ).mod();
Vector vFrg;
Vector vFro;
double FRG = CDebugDlg::m_pDebugDlg->m_frg / DisRG;//引力参数
vFrg = makePoint( v, goal, FRG, FALSE );
double FRO = CDebugDlg::m_pDebugDlg->m_fro / DisRO;//斥力参数
vFro = makePoint( v, vObs, FRO, TRUE );
// fprintf( pFile, "%lf\n%lf\n", vFrg.x, vFrg.y );
// fprintf( pFile, "%lf\n%lf\n", vFro.x, vFro.y );
//力合成
// if( DisRO < 120.0 && v != goal )
vTemp = vFrg + vFro - v;
// fprintf( pFile, "%lf\n%lf\n", vTemp.x, vTemp.y );
MoveToNoOA( vTemp );
// fclose( pFile );
return 0;
}
*/
/*
Vector Player::makePoint( Vector& v1, Vector& v2, double L, BOOL d )
{
double sin = (v1.y-v2.y)/((v1-v2).mod());
double cos = (v1.x-v2.x)/((v1-v2).mod());
if(d)
return Vector( v1.x+L*cos, v1.y+L*sin );
else
return Vector( v1.x-L*cos, v1.y-L*sin );
}
*/
/*
int Player::makeRoot( Line& l, Circle& c, Vector& v1, Vector& v2 )
{
//假设直线是y=k*x+b, 圆是(x-m)^2+(y-n)^2=r^2
//带入化简得方程
//(k^2+1)*(x^2)+2*(k*(b-n)-m)*x+(m^2)+(b-n)^2-(r^2)=0
double A = pow(l.GetK(),2)+1.0;
double B = 2.0*(l.GetK()*(l.GetB()-c.GetCentre().y)-c.GetCentre().x);
double C = pow(c.GetCentre().x, 2)+pow(l.GetB()-c.GetCentre().y, 2)-pow(c.GetRadius(), 2);
double delta = pow(B, 2)-4.0*A*C;
double x1, x2, y1, y2;//求得的根
if( A == 0.0 )
{
x1 = -C/B;
y1 = l.GetK()*x1 + l.GetB();//带入x1求得y1
v1 = Vector( x1, y1 );
v2 = Vector( x1, y1 );
return 1;//返回根的个数
}
else
{
if( delta >0 )
{
delta = sqrt(delta);
x1 = ( -B + delta ) / ( 2.0 * A );
x2 = ( -B - delta ) / ( 2.0 * A );
y1 = l.GetK()*x1 + l.GetB();//带入x1求得y1
y2 = l.GetK()*x2 + l.GetB();//带入x2求得y2
v1 = Vector( x1, y1 );
v2 = Vector( x2, y2 );
return 2;//返回根的个数
}
else if( delta == 0.0 )
{
x1 = -B / ( 2.0 * A );
y1 = l.GetK()*x1 + l.GetB();//带入x1求得y1
v1 = Vector( x1, y1 );
v2 = Vector( x1, y1 );
return 1;//返回根的个数
}
else
return 0;//无解
}
return 0;
}
*/
/*
int Player::SmartMove(Vector &v, double ang )
{
double L = 50.0;
double R = 20.0;
FILE *pFile=fopen("tpos.txt","a+");
Line l, lt;
l.makeLine( v, ang );
Vector v1, v2, vt;
if( l.GetK() > 0 )
vt = makePoint( l, v, L, FALSE );//求l反向延长线上与点v距离为L的点,即切点
else
vt = makePoint( l, v, L, TRUE );
fprintf(pFile,"Goal %lf, %lf\n", v.x, v.y );
// fprintf(pFile,"切点 %lf, %lf\n", vt.x, vt.y );
lt.makeLine( vt, ang+90.0 );//切点与圆心的连线
Vector pos = Get_vPos();
fprintf(pFile,"位置 %lf, %lf\n", pos.x, pos.y );
if( pos.y >= vt.y )
{
if( l.GetK() > 0 )
v2 = makePoint( lt, vt, R, FALSE );//求得圆心
else
v2 = makePoint( lt, vt, R, TRUE );
// fprintf(pFile,"圆F %lf, %lf\n", v2.x, v2.y );
}
else
{
if( l.GetK() > 0 )
v2 = makePoint( lt, vt, R, TRUE );//求得圆心
else
v2 = makePoint( lt, vt, R, FALSE );
// fprintf(pFile,"圆T %lf, %lf\n", v2.x, v2.y );
}
Circle c;
c.makeCircle( v2, R );//过点v2作圆
l.makeLine( v, pos );//目标点与当前点的连线,指向当前点
//目标点与当前点的中点
v1 = Vector((v.x+pos.x)/2.0, (v.y+pos.y)/2.0 );
// fprintf(pFile,"中点 %lf, %lf\n", v1.x, v1.y );
//过中点做垂直平分线
l.makeLine( v1, l.GetAngle()+90.0 );
//求此平分线与圆的交点
while( !makeRoot( l, c, v1, v2 ) )
{
R += 10.0;//修正R
if( pos.y >= vt.y )
{
if( l.GetK() > 0 )
v2 = makePoint( lt, vt, R, FALSE );//求得圆心
else
v2 = makePoint( lt, vt, R, TRUE );
// fprintf(pFile,"圆F %lf, %lf\n", v2.x, v2.y );
}
else
{
if( l.GetK() > 0 )
v2 = makePoint( lt, vt, R, TRUE );//求得圆心
else
v2 = makePoint( lt, vt, R, FALSE );
// fprintf(pFile,"圆T %lf, %lf\n", v2.x, v2.y );
}
c.makeCircle( v2, R );//过点v2作圆
// fprintf(pFile,"半径 %lf\n", R );
}
fprintf(pFile,"v1 = %lf, %lf\n", v1.x, v1.y );
fprintf(pFile,"v2 = %lf, %lf\n", v2.x, v2.y );
v1 = judgeRoot( v1, v2 );
fprintf(pFile,"goto %lf, %lf\n", v1.x, v1.y );
if( pos == vt )//如果到达切点,就直线移动到目标点
{
EAPFMove( v );
return 0;
}
EAPFMove( v1 );
fclose(pFile);
return 0;
}
*/
/*
Vector& Player::judgeRoot( Vector& v1, Vector& v2 )
{
double dis1 = (v1-Get_vPos()).mod();
double dis2 = (v2-Get_vPos()).mod();
Vector TurnPt = Get_vPos();
if( bIsHaveObstacle( v1, TurnPt ) && bIsHaveObstacle( v2, TurnPt ) && dis1 >= dis2 )
return v1;
if( dis1 >= dis2 )
{
if( bIsHaveObstacle( v1, TurnPt ) )//如果v1上有障碍
return v2;
//没有就返回v1
return v1;
}
else
{
if( bIsHaveObstacle( v2, TurnPt ) )//如果v2上有障碍
return v1;
return v2;
}
}
*/
/*
Vector Player::makePoint( Line& l, Vector& v, double L, BOOL d )
{//在直线上l求与点v距离为L的点,d保留
double x;
if(d)
x = Get_vPos().x + 50.0;
else
x = Get_vPos().x - 50.0;
double y = l.GetK()*x + l.GetB();
Vector v1(x, y);
return makePoint( v, v1, L, d );
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -