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

📄 worldmodel.h

📁 一个C编写的足球机器人比赛程序
💻 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 + -