📄 worldmodel.h
字号:
#ifndef WORLDMODEL_H
#define WORLDMODEL_H
#include "Ball.h"
#include "Robot.h"
class WorldModel
{
public:
Ball ball;
Robot ownRobots[5];
Robot opsRobots[5];
public:
// ***********************************************************
// -------------------------predict---------------------------
// ***********************************************************
// 预测物体o在经过dCycles后的状态。
// 如果是球,只考虑速度衰减。如果是人,便始终使用iDashPower的加速力量。
// bUpdate表示是否希望对posIn和velIn的值进行更新。
// 当然前提条件是函数使用时传入posIn和velIn。
// 函数最后返回预测后的地点值(等同于更新后的posIn)。
VecPosition predictPosAfterNrCycles ( ObjectT o,
double dCycles,
int iDashPower,
VecPosition *posIn,
VecPosition *velIn,
bool bUpdate = true );
// 预测球员在执行Dash(加速)命令后的状态。
// 其中dActualPower、dDirection为别是加速的力量和方向参数。
// pos,vel,sta需传入之前的位置、速度、体力,预测后会更新它们。
// 注意:ObjectT需要传入预测球员的类型,这在异构球员的情况下会有用。
void predictStateAfterDash ( double dActualPower,
VecPosition *pos,
VecPosition *vel,
Stamina *sta,
double dDirection );
// 预测球员在执行Turn(转头)命令后的状态。
// 其中dSendAngle为Turn命令的转角参数。
// pos,vel,angBody,angNeck需传入之前的位置、速度、身体和头部方向,预测后更新。
// 注意:ObjectT需要传入预测球员的类型,这在异构球员的情况下会有用。
void predictStateAfterTurn ( AngDeg dSendAngle,
VecPosition *pos,
VecPosition *vel,
AngDeg *angBody,
Stamina *sta );
AngDeg getActualTurnAngle ( AngDeg angActualAngle,
double dSpeed );
// 返回在效用dEffort的作用下,经iCycles周期,
// 达到期望位置posRelTo(相对球员坐标)所需的DashPower。
// 其中angbody和vel分别为球员的身体朝向和速度。
// 返回速度dSpeed的影响下的转角angActualAngle的实际转角。
double getPowerForDash ( VecPosition posRelTo,
AngDeg angBody,
VecPosition vel,
double dEffort,
int iCycles = 1 );
// 返回达到期望(经dCycles周期移动dDist)所需的初始速度。
// 其中dDecay为速度的衰减率。
double getFirstSpeedFromDist ( double dDist,
double dCycles,
double dDecay );
AngDeg getObjectDirction ( ObjectT o );
Stamina getObjectStamina ( ObjectT o );
VecPosition getObjectPosition ( ObjectT o );
VecPosition getObjectVelocity ( ObjectT o );
// 根据球员obj到posTo的位置等关系,判断需要转身的次数。
// 通过考虑转身正面接球,转身背面接球的效率,来决定一系列的com,
// 并返回第一个com指令。
// 其中iCycles为到posTo的可用周期数,dDistBack为最大允许倒退距离,
// bMoveBack为是否允许倒退的开关。
// 注意:
// 1、该函数里面包含了许多主观经验成分,暂时无法验证其可靠性。
// 2、在函数中发现疑似误码:
/* if( pos.getDistanceTo(posTo) > 30.0 )
dRatioTurn = 4.0; //这段代码没用!!!
是否应该将下句代码的if改为else if???
*/
TCommand predictCommandTurnTowards ( ObjectT o,
VecPosition posTo,
int iCycles,
double dDistBack,
bool bMoveBack,
VecPosition *pos,
VecPosition *vel,
AngDeg *angBody );
TCommand predictCommandToMoveToPos ( ObjectT o,
VecPosition posTo,
int iCycles,
VecPosition *pos,
VecPosition *vel,
AngDeg *angBody,
double dDistBack = 2.5,
bool bMoveBack = false);
// 预测球员在用dPower执行Dash命令后的体力值sta。
// 由于每周期都可以得到Stamina的准确值,所以这个函数用处不是很大。
void predictStaminaAfterDash ( double dPower,
Stamina *sta );
// 预测球员执行命令后的状态
void predictStateAfterCommand ( TCommand com,
VecPosition *pos,
VecPosition *vel,
AngDeg *dDirection,
Stamina *sta = NULL );
void makeCommand ( TCommand *com,
CommandTypeT comType,
double comP0,
double comP1 );
// 返回Turn命令中的Angle,考虑到速度dSpeed的影响,
// 其中angDesiredAngle为期望转角。
AngDeg getAngleForTurn ( AngDeg angDesiredAngle,
double dSpeed );
// 返回属于ObjectSetT的object,且到以vel速度dDecay速率衰减从pos点移动的物体。
// iCycles将返回与该物体相遇需要的周期数。
ObjectT getFastestInSetTo ( ObjectSetT objectSet,
VecPosition *pos,
VecPosition vel,
double dDecay,
int *iCycles = NULL );
void getInfbySet ( ObjectSetT objectSet,
setInfT *setInf );
ObjectT getObjectbyInf ( setInfT setInf );
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -