亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? worldmodelpredict.cpp

?? 一個C編寫的足球機器人比賽程序
?? CPP
字號:
#include "Worldmodel.h"



/*! This method determines the global position of the object o after iCycles
When the object is the ball, only the decay of the ball is taken into
account. When the object is a player it
is assumed that the player dashes with 'iDashPower' every cycle.
\param o objectT of which global position will be predicted
\param iCycles pos is predicted after this number of cycles
\param iDashPower dash power that is used every cycle in dash (default 100)
\param vel will be filled with predicted global velocity after iCycles
\return predicted global position after iCycles. */
VecPosition WorldModel::predictPosAfterNrCycles( ObjectT o,double dCycles, int iDashPower, 
												 VecPosition *posIn, VecPosition *velIn,
												 bool bUpdate )
{
    VecPosition vel = *velIn ;
    VecPosition pos = *posIn ;

    if( o == O_Ball )
    {
        // get the speed and the distance it travels in iCycle's.
        // use this distance and direction it travels in, to calculate new pos
        // geom series is serie s=a+ar+..+ar^n...decay=r,iCycles=n,dSpeed=a
        double dDist = Geometry::getSumGeomSeries( vel.getMagnitude(),
												   CBALLDECAY, dCycles);
        pos         += VecPosition( dDist, vel.getDirection(), POLAR );
        vel         *= pow( CBALLDECAY, dCycles );
    }
    else 
    {
        double      dDirection = getObjectDirction(o); // used when no info about global body
        Stamina     stamina =getObjectStamina(o);      // used when object is agent
		
        predictStateAfterDash( iDashPower, &pos, &vel, &stamina, dDirection );
    }

    if( posIn != NULL && bUpdate )
        *posIn = pos;
    if( velIn != NULL && bUpdate )
        *velIn = vel;

    return pos;
}


/*! This method updates all the stamina variables using the calculations from
the soccer manual. It is not really important since stamina is read from
sense_body every cycle. That information is more up to date.
\param power of last dash command
\param stamina pointer to all stamina values, will change to new value
\return stamina class will be updated to new stamina values */
void WorldModel::predictStaminaAfterDash( double dPower, Stamina *stamina )
{
    double sta = stamina->getStamina();
    double eff = stamina->getEffort();
    double rec = stamina->getRecovery();

	// double negative value when dashed backwards
	sta -= ( dPower > 0.0 ) ? dPower : -2 * dPower ;
	if( sta < 0 ) sta = 0;

	// stamina below recovery threshold, lower recovery
	if( sta <= CRECOVERDECTHR*CSTAMINAMAX && rec > CRECOVERMIN)
		rec -= CRECOVERDEC;
	
	// stamina below effort decrease threshold, lower effort
	if( sta <= CRECOVERDECTHR*CSTAMINAMAX && eff > CEFFORTMIN )
		eff -= CEFFORTDEC;
	
	// stamina higher than effort incr threshold, raise effort and check maximum
	if( sta >= CEFFORTINCTHR * CSTAMINAMAX && eff < 1.0)
	{
		eff += CEFFORTINC;
		if ( eff > 1.0 )
			eff = 1.0;
	}
	
	// increase stamina with (new) recovery value and check for maximum
	sta += rec*CSTAMINAINCMAX;
	if ( sta > CSTAMINAMAX )
		sta = CSTAMINAMAX;
	
    stamina->setStamina ( sta );
    stamina->setEffort  ( eff );
    stamina->setRecovery( rec );
}



/*! This method determines the state of a player after a dash command is
performed. The current state of the player is specified by the passed
arguments. After this method returns, all arguments are updated.
\param pos initial position, will be changed to the predicted position
\param vel intital velocity, will be changed to the predicted velocity
\param dActualPower actual power that is send with dash command
\param sta pointer to stamina, when not NULL, effort is used and updated
\param dDirection direction of dash */
void WorldModel::predictStateAfterDash( double dActualPower, VecPosition *pos,
                                        VecPosition *vel, Stamina *sta, double dDirection )
{
    // get acceleration associated with actualpower
    double dEffort = sta->getEffort();
    double dAcc    = dActualPower * CDASHPOWERRATE * dEffort;

    // add it to the velocity; negative acceleration in backward direction
    if( dAcc > 0 )
        *vel += VecPosition::getVecPositionFromPolar( dAcc, dDirection );
    else
        *vel += VecPosition::getVecPositionFromPolar( fabs(dAcc),
        VecPosition::normalizeAngle(dDirection+180));

    // check if velocity doesn't exceed maximum speed
    if( vel->getMagnitude() > CMAXROBOTV )
        vel->setMagnitude( CMAXROBOTV );

    // add velocity to current global position and decrease velocity
    *pos += *vel;
    *vel *= CMAXROBOTDECAY;
    predictStaminaAfterDash( dActualPower, sta );
}




/*! This method returns the command for object 'obj' to turn towards a point
'posTo' on the field when it has 'iCycles' to reach that point. If
the point is within 'dDistBack' behind the object it will try to dash
backwards. In the case that 'bMoveBack' is true, it will always try to
move backwards. When posIn, velIn and angBodyIn are equal to NULL, the
current agent information is used. */
TCommand WorldModel::predictCommandTurnTowards( ObjectT o,VecPosition posTo, int iCycles, 
											    double dDistBack, bool bMoveBack,
												VecPosition *posIn, VecPosition *velIn,
												AngDeg *angBodyIn )
{
    TCommand      soc, socFirst;
    VecPosition   pos, vel;
    AngDeg        angBody, ang, angTo;
    Stamina       sta;
    bool          bFirst = true;

    // fill in all values
    angBody = *angBodyIn;
    pos     = *posIn;
    vel     = *velIn;
   
	socFirst.CommandType = Com_Stay;
    // predict where we will finally stand when our current vel is propogated
    // and then check the orthogonal distance w.r.t. our body direction
    VecPosition posPred=predictPosAfterNrCycles( o, min(iCycles,4),
											     0, &pos, &vel, false );
    Line        line   =Line::makeLineFromPositionAndAngle( posPred, angBody );
    double      dDist  =line.getDistanceWithPoint( posTo );

    // get the angle to this point
    angTo = (posTo - posPred).getDirection();
    angTo = VecPosition::normalizeAngle( angTo - angBody );

    // determine whether we want to turn based on orthogonal distance 
    double dRatioTurn;
    if( pos.getDistanceTo(posTo) > 30.0 ) 
        dRatioTurn = 4.0;  
    if( pos.getDistanceTo(posTo) > 20.0 ) 
        dRatioTurn = 3.0;  
    else if( pos.getDistanceTo(posTo) > 10 ) 
        dRatioTurn = 2.0;
    else
        dRatioTurn = 0.90 ;

    AngDeg angTmp = angTo + (bMoveBack) ? 180 : 0;
    angTmp = VecPosition::normalizeAngle( angTmp );

    // turn when: 
    //  1. point lies outside our body range (forward and backwards)
    //  2. point lies outside distBack and behind us (forward move) 
    //  3. point lies outside distBack and in front of us backwards move)
    int    turn = 0;
    while( ( dDist > dRatioTurn * CKICKABLEDIST ||
         ( posPred.getDistanceTo( posTo ) > dDistBack && 
         ( ( fabs( angTo ) > 90 && bMoveBack == false  ) ||
         ( fabs( angTo ) < 90 && bMoveBack == true ) ) ) )
           && turn < 5 && fabs( angTmp ) > dPlayerWhenToTurnAngle )
    {

        ang = (posTo - posPred).getDirection() + (( bMoveBack == true )?180:0);
        ang = VecPosition::normalizeAngle( ang - angBody );
        makeCommand(&soc,Com_Turn,getAngleForTurn(ang,vel.getMagnitude()),0);
        
        if( bFirst == true )
            socFirst = soc;
        bFirst = false;
        predictStateAfterTurn(soc.ComParam0, &pos, &vel, &angBody,&sta);
        line = Line::makeLineFromPositionAndAngle( posPred, angBody );
        dDist = line.getDistanceWithPoint( posTo );
        angTo = (posTo - posPred).getDirection();
        angTo = VecPosition::normalizeAngle( angTo - angBody );
        turn++;
    }

    // if very close and have to turn a lot, it may be better to move with our
    // back to that point
    if( turn > 1 && iCycles < 4 && posPred.getDistanceTo( posTo ) < dDistBack &&
        bMoveBack == false)
    {
        angBody =  *angBodyIn;
        pos     =  *posIn;
        vel     =  *velIn;
        ang = (posTo - posPred).getDirection() + 180;
        ang = VecPosition::normalizeAngle( ang - angBody );
        makeCommand(&soc,Com_Turn,getAngleForTurn(ang,vel.getMagnitude()),0);
        predictStateAfterTurn( soc.ComParam0,&pos,&vel,&angBody,&sta);
        line = Line::makeLineFromPositionAndAngle( posPred, angBody );
        dDist = line.getDistanceWithPoint( posTo );
        if( dDist < 0.9 * CKICKABLEDIST  )
        {
            //Log.log( 463, "turn around and intercept with back" );
            return soc;
        }
    }

    return socFirst;
}


/*! This method determines the state of a player after a turn command is
performed. The global position is updated with the velocity and the
velocity is updated. Then the actual turn angle is calculated taken the
inertia into account. This actual turn angle is used to update both
the global body and global neck direction.
\param dSendAngle actual angle given in command
\param pos initial position, will be changed to the predicted position
\param vel intital velocity, will be changed to the predicted velocity
\param angBody global body direction
\param angNeck global neck direction
\param sta Stamina of player can be NULL */
void WorldModel::predictStateAfterTurn( AngDeg dSendAngle, VecPosition *pos, 
									    VecPosition *vel, AngDeg *angBody, 
										Stamina *sta )
{
    // calculate effective turning angle and neck accordingly
    double dEffectiveAngle;
    dEffectiveAngle = getActualTurnAngle( dSendAngle, vel->getMagnitude() );
    *angBody = VecPosition::normalizeAngle( *angBody + dEffectiveAngle );
    // update as if dashed with no power
    predictStateAfterDash( 0.0, pos, vel, sta, *angBody );
    return;
}


/*! This method returns the command to move to a position, first it checks
whether a turn is necessary. When this is the case, it performs the turn.
Otherwise a dash command is generated to move in 'iCycles' cycles to
the point 'posTo'. */
TCommand WorldModel::predictCommandToMoveToPos( ObjectT o, VecPosition posTo, int iCycles, 
											    VecPosition *posIn, VecPosition *velIn, 
												AngDeg *angBodyIn, double dDistBack /* = 2.5 */, 
												bool bMoveBack /* = false */)
{
    VecPosition   pos, vel;
    AngDeg        angBody;
    TCommand	  soc;
    double        dPower;

    // fill in all values
    angBody =  *angBodyIn;
    pos     =  *posIn;
    vel     =  *velIn;

    soc = predictCommandTurnTowards(o, posTo, iCycles, dDistBack, bMoveBack,
									posIn, velIn,   angBodyIn);
    if( soc.CommandType != Com_Stay )
        return soc;

    dPower = getPowerForDash( posTo-pos, angBody, vel,getObjectStamina(o).getEffort(),
							  iCycles );
	makeCommand(&soc,Com_Dash,dPower,0);
    return soc;
}

void WorldModel::predictStateAfterCommand( TCommand com, VecPosition *pos, VecPosition *vel,
										   AngDeg *dDirection, Stamina *sta /* = NULL  */)
{
	//Com_Stay, Com_Turn, Com_Kick, Com_Dash, Com_Catch
	switch(com.CommandType) {
	case Com_Stay:
	case Com_Kick:
		predictStateAfterDash(0,pos,vel,sta,*dDirection);
		break;
	case Com_Turn:
		predictStateAfterTurn(com.ComParam0,pos,vel,dDirection,sta);
		break;
	case Com_Dash:
		predictStateAfterDash(com.ComParam0,pos,vel,sta,*dDirection);
		break;
	case Com_Catch:
		*pos = (*pos + ball.getPosition()) / 2.0;
		*vel = VecPosition(0,0);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品福利在线一区二区三区| 91欧美激情一区二区三区成人| 午夜精品久久久久久久久久| 国产精品电影院| 中文字幕免费不卡在线| 国产欧美精品一区二区三区四区| 中文字幕欧美激情一区| 中文字幕av资源一区| 综合自拍亚洲综合图不卡区| 亚洲色图第一区| 亚洲第一av色| 黄网站免费久久| 国产黑丝在线一区二区三区| 成人精品免费网站| 色猫猫国产区一区二在线视频| 欧美综合天天夜夜久久| 日韩一级二级三级精品视频| 精品国产91九色蝌蚪| 国产精品污污网站在线观看| 亚洲理论在线观看| 免费观看在线综合| 成人h动漫精品一区二区| 欧美这里有精品| 欧美刺激脚交jootjob| 欧美激情中文字幕| 性感美女久久精品| 国产精品一品视频| 欧美日韩亚洲高清一区二区| 久久久精品2019中文字幕之3| 国产精品久久久久三级| 亚洲图片自拍偷拍| 懂色av一区二区三区免费看| 欧美日韩国产一级二级| 久久久av毛片精品| 一区二区三区在线不卡| 免费一区二区视频| 99精品视频一区二区| 欧美日韩高清一区二区不卡| 国产午夜三级一区二区三| 亚洲精品乱码久久久久久日本蜜臀| 午夜精品福利视频网站| 99精品欧美一区二区蜜桃免费| 7777精品伊人久久久大香线蕉最新版| 久久久不卡网国产精品一区| 亚洲午夜久久久久久久久久久| 国产美女久久久久| 欧美日韩精品欧美日韩精品| 中文字幕 久热精品 视频在线 | 国产一区二区在线影院| 色老汉av一区二区三区| 亚洲国产精品ⅴa在线观看| 蜜臀av一区二区三区| 欧洲精品在线观看| 亚洲女同一区二区| 不卡电影免费在线播放一区| 精品国产一区久久| 日日摸夜夜添夜夜添国产精品| 99精品国产热久久91蜜凸| 国产丝袜欧美中文另类| 狠狠狠色丁香婷婷综合激情 | 制服丝袜亚洲色图| 亚洲黄色小视频| 97国产一区二区| 国产精品二三区| 不卡一二三区首页| 中文字幕乱码一区二区免费| 国产sm精品调教视频网站| 精品国产一区二区亚洲人成毛片| 青青草国产成人av片免费| 欧美久久一区二区| 一区二区三区中文在线| 欧洲色大大久久| 亚洲一二三专区| 在线观看91视频| 亚洲综合久久久久| 欧美少妇一区二区| 亚洲精品久久久蜜桃| 日本电影亚洲天堂一区| 亚洲精品美腿丝袜| 欧美日韩精品高清| 免费在线观看一区二区三区| 精品美女一区二区| 国产高清久久久| 中文字幕第一区二区| 不卡一区在线观看| 亚洲乱码国产乱码精品精98午夜| 日本大香伊一区二区三区| 亚洲国产日日夜夜| 日韩欧美国产精品| 加勒比av一区二区| 国产精品高清亚洲| 欧美性受xxxx黑人xyx性爽| 香蕉久久夜色精品国产使用方法| 日韩午夜中文字幕| 国产麻豆欧美日韩一区| 中文字幕一区视频| 欧美日韩电影在线播放| 国产一区二区精品久久99| 国产精品国产三级国产专播品爱网| 99久久精品国产一区| 日韩和欧美的一区| 国产日韩av一区| 欧美日韩高清在线播放| 国产成人精品aa毛片| 首页亚洲欧美制服丝腿| 久久亚洲私人国产精品va媚药| 不卡视频在线看| 美女视频免费一区| 亚洲精品久久嫩草网站秘色| 欧美大胆一级视频| 99国产精品国产精品毛片| 免费在线观看成人| 樱桃视频在线观看一区| 欧美大片顶级少妇| 欧美图片一区二区三区| 国产一区二区精品久久| 午夜欧美2019年伦理| 国产欧美一区二区三区在线看蜜臀 | 亚洲午夜激情网页| 久久夜色精品国产欧美乱极品| 欧美综合一区二区三区| 国产麻豆视频一区二区| 五月天激情小说综合| 欧美国产亚洲另类动漫| 日韩精品一区二区三区中文不卡| 不卡的av电影在线观看| 精品一区二区免费在线观看| 亚洲成人精品在线观看| 国产精品电影一区二区三区| 精品国产乱码久久| 欧美日韩一区在线观看| 99这里只有精品| 国产综合成人久久大片91| 亚洲一区二区欧美日韩| 亚洲欧洲日本在线| 国产三级欧美三级日产三级99 | 国产亚洲短视频| 欧美一级搡bbbb搡bbbb| 色婷婷综合中文久久一本| 成人avav在线| 国产馆精品极品| 国产成人福利片| 成人在线视频一区| 蜜桃一区二区三区在线| 日韩精品视频网站| 亚洲成av人片在线观看无码| 一区二区三区欧美在线观看| 国产精品色哟哟| 国产精品不卡一区二区三区| 日本一区二区三区四区| 久久久久久影视| 久久婷婷国产综合精品青草| 精品毛片乱码1区2区3区| 日韩欧美国产三级| 久久夜色精品国产欧美乱极品| 精品人伦一区二区色婷婷| 日韩女同互慰一区二区| 久久综合成人精品亚洲另类欧美 | 久久亚洲精精品中文字幕早川悠里 | 99久久夜色精品国产网站| www.成人网.com| 色综合天天性综合| 91女人视频在线观看| 色94色欧美sute亚洲线路二| 欧美午夜精品久久久久久超碰| 欧美日韩国产精品成人| 欧美在线啊v一区| 欧美日韩另类国产亚洲欧美一级| 欧美人成免费网站| 日韩免费一区二区| 中文字幕在线观看一区| 亚洲一区在线观看免费| 青青草97国产精品免费观看| 国产精品一二三四五| 91亚洲精品久久久蜜桃| 欧美日韩一区成人| 精品国产制服丝袜高跟| 1区2区3区欧美| 日韩精品一二三区| 成人性视频免费网站| 99久久综合色| 91精品国产综合久久久蜜臀粉嫩| 欧美三级乱人伦电影| 精品国产乱码久久久久久牛牛| 国产欧美日韩综合| 亚洲美女免费在线| 免费在线欧美视频| 色综合天天综合狠狠| 日韩免费观看高清完整版在线观看| 欧美激情一区二区| 日韩黄色免费电影| 不卡一区中文字幕| 精品久久国产老人久久综合| 亚洲精品日日夜夜| 国产一区二区免费看| 在线91免费看| 1000部国产精品成人观看| 麻豆91在线播放| 欧美三级午夜理伦三级中视频| 久久精品视频网|