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

📄 communicate.cpp

📁 本程序是2005年参加中国机器人大赛的比赛程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	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 + -