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

📄 analyzer.cpp

📁 The application wizard has created this SoccerDoctor application for you. This application not onl
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//在线教练分析器
#include "StdAfx.h"
#include "analyzer.h"
#include "MainFrm.h"

CAnalyzer::CAnalyzer()
{
	vBasicEvent.clear();
	BasicBehaviorEvent tempEvent;
	tempEvent.time=0;
	tempEvent.endTime=0;
	tempEvent.team=-1;
	tempEvent.player=-1;
	tempEvent.type=BB_NONE;
	vBasicEvent.push_back(tempEvent);
	_sInnerState.ballKickableForPlayer=false;
	_sInnerState.lastCycleBallKickableForPlayer=false;
	_sInnerState.lastCyclePlayerWithBall=-1;
	_sInnerState.lastCyclePlayMode=PM_BeforeKickOff;
	_sInnerState.lastCycleScoreLeft=0;
	_sInnerState.lastCycleScoreRight=0;
	_sInnerState.lastCycleTeamWithBall=-1;
	_sInnerState.parameterNeedFillBack=false;
	_sInnerState.playerWithBall=-1;
	_sInnerState.playerWithBallChange=false;
	_sInnerState.playMode=PM_BeforeKickOff;
	_sInnerState.prePlayerWithBall=-1;
	_sInnerState.preTeamWithBall=0;
	_sInnerState.scoreLeft=0;
	_sInnerState.scoreRight=0;
	_sInnerState.teamWithBall=0;

	_sInnerState.teamWithBallChange=false;
	_sInnerState.statDataInvoked=false;
	_sInnerState.logLoaded=false;
	vPlayerPosition.clear();
	_sInnerState.lastCycle=65536;
	resetStatData();

	ifstream infile("plan_recognition_parameters.txt");
	if(infile==NULL){
		region_height=REGIONHEIGHT ;
		region_width=REGIONWIDTH;
		chi2_threshold=CRITICALVALUE;
	}else{
		infile>>region_width>>region_height>>chi2_threshold;
	}
}

CAnalyzer::~CAnalyzer(void)
{
}

void CAnalyzer::init(CMainFrame* pMainFrame)
{
	_pMainFrame = pMainFrame;
}

int CAnalyzer::analyzeOneCycleInfo(const showinfo_t2 &sCycleInfo)
{
	//备份该周期的信息
	convertNetData(sCycleInfo);

	//判断是否要将统计数据复位
	if((int)_sCycleInfo.time<_sInnerState.lastCycle){
		resetStatData();
		resetInnerState();
	}
	_sInnerState.lastCycle=_sCycleInfo.time;


	//记录球员位置
	recordPlayerPosition();

	//判断控球方
	getTeamWithBall();

	//debug
	//if(_sCycleInfo.time==2810){
	//	_sCycleInfo.time=2810;
	//}
	//double debug_x,debug_y;
	

	//处理Play Mode变化的情况
	//统计数据更新
	if(_sInnerState.playMode!=_sInnerState.lastCyclePlayMode)
	switch(_sCycleInfo.pmode) {
	case PM_TimeOver:
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_OffSide_Left:
		_sStatData.nTeamOffsideCount[0]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_OffSide_Right:
		_sStatData.nTeamOffsideCount[1]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_Back_Pass_Left:
		_sStatData.nTeamBackPassCount[0]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_Back_Pass_Right:
		_sStatData.nTeamBackPassCount[1]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_Free_Kick_Fault_Left:
		_sStatData.nTeamKickFaultCount[0]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_Free_Kick_Fault_Right:
		_sStatData.nTeamKickFaultCount[1]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_KickIn_Left:
		_sStatData.nTeamKickInCount[0]++;
		break;
	case PM_KickIn_Right:
		_sStatData.nTeamKickInCount[1]++;
		break;
	case PM_CornerKick_Left:
		_sStatData.nTeamCornerKickCount[0]++;
		//if(vBasicEvent[vBasicEvent.size()-1].team==1){
			vBasicEvent[vBasicEvent.size()-1].success=false;
			vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
			vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
			vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
			return 0;
		//}
		break;
	case PM_CornerKick_Right:
		_sStatData.nTeamCornerKickCount[1]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_FreeKick_Left:
		_sStatData.nTeamFreeKickCount[0]++;
		break;
	case PM_FreeKick_Right:
		_sStatData.nTeamFreeKickCount[1]++;
		break;
	case PM_GoalKick_Left:
		_sStatData.nTeamGoalKickCount[0]++;
		vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_GoalKick_Right:
		_sStatData.nTeamGoalKickCount[1]++;
		//BasicBehaviorEvent debug_event=vBasicEvent[vBasicEvent.size()-1];
        vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_KickOff_Left:
		if(vBasicEvent[vBasicEvent.size()-1].type!=BB_SHOOT)
			vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	case PM_KickOff_Right:
		//BasicBehaviorEvent debug_event=vBasicEvent[vBasicEvent.size()-1];
		if(vBasicEvent[vBasicEvent.size()-1].type!=BB_SHOOT)
			vBasicEvent[vBasicEvent.size()-1].success=false;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.x =vPlayerPosition[vPlayerPosition.size()-2].ball.x;
		vBasicEvent[vBasicEvent.size()-1].obj.pt.y =vPlayerPosition[vPlayerPosition.size()-2].ball.y;
		vBasicEvent[vBasicEvent.size()-1].endTime=sCycleInfo.time;
		return 0;
		break;
	default:
		break;
	}

	//判断球员的可能行为
	if(_sInnerState.ballKickableForPlayer){
		if(!_sInnerState.lastCycleBallKickableForPlayer){
			//上一个周期没有球员踢到球这个周期有球员踢到球
			//说明有球员拦截到球但是有几种可能
			//接球、断球、带球
			//如果控球方发生变化那就是断球
			//否则如果控球球员变化那就是接球
			//否则就是带球
			BasicBehaviorEvent tempEvent;
			if(vBasicEvent[vBasicEvent.size()-1].team!=_sInnerState.teamWithBall){
				//断球
				//处理基本行为事件队列
				tempEvent.time=_sCycleInfo.time;
				tempEvent.endTime=_sCycleInfo.time;
				tempEvent.team=_sInnerState.teamWithBall;
				tempEvent.player=_sInnerState.playerWithBall;
				tempEvent.type=BB_INTERCEPT;
				tempEvent.success=true;
				tempEvent.pt.x=_sCycleInfo.ball.x;
				tempEvent.pt.y=_sCycleInfo.ball.y;
				vBasicEvent.push_back(tempEvent);
				//回填前一个行为的参数
				if(!(vBasicEvent[vBasicEvent.size()-2].type==BB_SHOOT && vBasicEvent[vBasicEvent.size()-2].success)){
					if(vBasicEvent[vBasicEvent.size()-2].success){
						vBasicEvent[vBasicEvent.size()-2].obj.pt.x=_sCycleInfo.ball.x;
						vBasicEvent[vBasicEvent.size()-2].obj.pt.y=_sCycleInfo.ball.y;
						vBasicEvent[vBasicEvent.size()-2].endTime=_sCycleInfo.time;
						vBasicEvent[vBasicEvent.size()-2].success=false;
					}
				}else{
					if(!(_sCycleInfo.ball.x==0 && _sCycleInfo.ball.y==0)){
						vBasicEvent[vBasicEvent.size()-2].obj.pt.x=_sCycleInfo.ball.x;
						vBasicEvent[vBasicEvent.size()-2].obj.pt.y=_sCycleInfo.ball.y;
						vBasicEvent[vBasicEvent.size()-2].endTime=_sCycleInfo.time;
						vBasicEvent[vBasicEvent.size()-2].success=false;
					}
				}
			}else if(_sInnerState.prePlayerWithBall!=_sInnerState.playerWithBall){
				//接球
				//填基本行为事件队列
				tempEvent.time=_sCycleInfo.time;
				tempEvent.endTime=_sCycleInfo.time;
				tempEvent.team=_sInnerState.teamWithBall;
				tempEvent.player=_sInnerState.playerWithBall;
				tempEvent.type=BB_RECEIVE;
				tempEvent.obj.unum=_sInnerState.prePlayerWithBall;
				tempEvent.success=true;
				tempEvent.pt.x=_sCycleInfo.ball.x;
				tempEvent.pt.y=_sCycleInfo.ball.y;
				vBasicEvent.push_back(tempEvent);
				//回填前一个行为的参数
				if(vBasicEvent[vBasicEvent.size()-2].success){
					vBasicEvent[vBasicEvent.size()-2].obj.pt.x=_sCycleInfo.ball.x;
					vBasicEvent[vBasicEvent.size()-2].obj.pt.y=_sCycleInfo.ball.y;
					vBasicEvent[vBasicEvent.size()-2].endTime=_sCycleInfo.time;
				}
				if(vBasicEvent[vBasicEvent.size()-2].type!=BB_SHOOT){
					if(vBasicEvent[vBasicEvent.size()-2].type!=BB_PASS){
						if(_sInnerState.prePlayerWithBall==_sInnerState.playerWithBall){
							vBasicEvent[vBasicEvent.size()-2].success=true;
						}else{
							vBasicEvent[vBasicEvent.size()-2].type=BB_PASS;
							vBasicEvent[vBasicEvent.size()-2].obj.unum=_sInnerState.playerWithBall;
							vBasicEvent[vBasicEvent.size()-2].success=true;
						}
					}else{
						vBasicEvent[vBasicEvent.size()-2].obj.unum=_sInnerState.playerWithBall;
						vBasicEvent[vBasicEvent.size()-2].success=true;
					}
				}else{
					vBasicEvent[vBasicEvent.size()-2].type=BB_PASS;
					vBasicEvent[vBasicEvent.size()-2].obj.unum=_sInnerState.playerWithBall;
					vBasicEvent[vBasicEvent.size()-2].success=true;
				}
			}else{
				//带球
				if(vBasicEvent[vBasicEvent.size()-1].type!=BB_DRIBBLE)
					vBasicEvent[vBasicEvent.size()-1].type=BB_DRIBBLE;
				if(vBasicEvent[vBasicEvent.size()-1].success){
					vBasicEvent[vBasicEvent.size()-1].obj.pt.x=_sCycleInfo.ball.x;
					vBasicEvent[vBasicEvent.size()-1].obj.pt.y=_sCycleInfo.ball.y;
					vBasicEvent[vBasicEvent.size()-1].endTime=_sCycleInfo.time;
				}else{
					tempEvent.time=_sCycleInfo.time;
					tempEvent.endTime=_sCycleInfo.time;
					tempEvent.team=_sInnerState.teamWithBall;
					tempEvent.player=_sInnerState.playerWithBall;
					tempEvent.type=BB_RECEIVE;
					tempEvent.obj.unum=_sInnerState.prePlayerWithBall;
					tempEvent.success=true;
					tempEvent.pt.x=_sCycleInfo.ball.x;
					tempEvent.pt.y=_sCycleInfo.ball.y;
					vBasicEvent.push_back(tempEvent);
				}
			}
		}else{
			//上一个周期有球员踢到球这个周期也有球员踢到球
			//有球员踢到球的情况没有变化
			//可能控球球员变化或者是调整球
			//如果控球方变化就是断球
			//否则如果控球球员变化则是传球
			//否则就是调整球
			BasicBehaviorEvent tempEvent;
			if(vBasicEvent[vBasicEvent.size()-1].team!=_sInnerState.teamWithBall){
				//断球
				//处理前一个周期踢到球的别方球员的行为
				//上一个周期的动作有可能是射门、传球、快速带球、解围或者是失误
				int shootSide;
				if(_sInnerState.lastCyclePlayerWithBall<11)
					shootSide=1;
				else
					shootSide=0;
				double shootProbability=caclShootProbability(shootSide);
				BasicBehaviorEvent tempEvent;
				if(shootProbability>SHOOTPROBABILITYTHRESHOLD){
					//判断为射门然后按上一个周期的参数添加入基本行为事件队列
					tempEvent.time=_sCycleInfo.time-1;
					tempEvent.endTime=_sCycleInfo.time;
					tempEvent.team=_sInnerState.lastCycleTeamWithBall;
					tempEvent.player=_sInnerState.lastCyclePlayerWithBall;
					tempEvent.type=BB_SHOOT;
					tempEvent.pt.x=vPlayerPosition[vPlayerPosition.size()-2].ball.x;
					tempEvent.pt.y=vPlayerPosition[vPlayerPosition.size()-2].ball.y;
					//double tmpX=shootSide?FIELDLENGTH/2:-FIELDLENGTH/2;
					tempEvent.obj.pt.x=_sCycleInfo.ball.x; //tmpX;
					tempEvent.obj.pt.y=_sCycleInfo.ball.y; //(_sCycleInfo.ball.y+_sCycleInfo.ball.deltay/_sCycleInfo.ball.deltax*(tmpX-_sCycleInfo.ball.x));
					tempEvent.success=false;
					vBasicEvent.push_back(tempEvent);
					//回填参数
					if(vBasicEvent[vBasicEvent.size()-2].success){
						vBasicEvent[vBasicEvent.size()-2].obj.pt.x=_sCycleInfo.ball.x;
						vBasicEvent[vBasicEvent.size()-2].obj.pt.y=_sCycleInfo.ball.y;
						vBasicEvent[vBasicEvent.size()-2].endTime=_sCycleInfo.time;
					}
				}else{
					int player=getFastestPlayerToBall(true,_sInnerState.lastCyclePlayerWithBall);
					if(player!=-1 && areTeammate(player,_sInnerState.lastCyclePlayerWithBall)){
						//判断为传球或者带球
						tempEvent.time=_sCycleInfo.time-1;
						tempEvent.endTime=_sCycleInfo.time;
						tempEvent.team=_sInnerState.lastCycleTeamWithBall;
						tempEvent.player=_sInnerState.lastCyclePlayerWithBall;
						if(player==_sInnerState.lastCyclePlayerWithBall)
							//带球
							tempEvent.type=BB_DRIBBLE;
						else
							//传球

⌨️ 快捷键说明

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