📄 analyzer.cpp
字号:
//在线教练分析器
#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 + -