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

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

?? worldmodelpredict.cpp

?? 機器人足球實現的核心代碼
?? 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一区二区三区免费野_久草精品视频
久久精品国产一区二区三| 欧美国产日韩一二三区| 亚洲综合另类小说| 日韩欧美在线不卡| 美美哒免费高清在线观看视频一区二区| 欧美精品在线观看一区二区| 天天综合色天天综合色h| 在线成人高清不卡| 精品一区二区精品| 亚洲国产精品成人综合色在线婷婷 | 亚洲最新在线观看| 欧美色精品在线视频| 日本va欧美va欧美va精品| 国产夜色精品一区二区av| aaa国产一区| 五月天网站亚洲| 久久久亚洲精品石原莉奈 | 91在线播放网址| 一区二区三区不卡视频| 中文字幕色av一区二区三区| 91无套直看片红桃| 日韩电影免费在线| 中文字幕成人网| 欧美日高清视频| 国产mv日韩mv欧美| 午夜a成v人精品| 亚洲国产精品t66y| 欧美老女人第四色| 成人听书哪个软件好| 午夜精品久久久久久久久| 国产精品色哟哟网站| 777欧美精品| 91在线一区二区三区| 久久国产精品露脸对白| 亚洲激情一二三区| 中国av一区二区三区| 欧美男女性生活在线直播观看| 国产精品1024| 视频一区国产视频| 麻豆一区二区在线| 一区二区三区在线观看网站| 久久综合九色综合欧美就去吻| 在线视频你懂得一区| 国产成人在线视频免费播放| 日韩精品免费专区| 一区二区三区免费在线观看| 久久久亚洲高清| 4hu四虎永久在线影院成人| 91在线你懂得| 国产精品白丝av| 蜜臀av性久久久久蜜臀av麻豆| 亚洲乱码国产乱码精品精98午夜 | 国产精品你懂的在线| 日韩欧美你懂的| 欧美日韩国产在线播放网站| 91啪九色porn原创视频在线观看| 久久精品国产精品亚洲综合| 亚洲第四色夜色| 亚洲综合在线视频| 亚洲欧美电影一区二区| 免费欧美在线视频| 亚洲国产视频在线| 亚洲欧美日韩在线| 国产欧美精品一区二区三区四区 | 在线视频综合导航| 色综合天天综合网天天狠天天| 国产成人小视频| 国产精品一二三四五| 韩国精品在线观看| 韩日av一区二区| 韩国毛片一区二区三区| 久草这里只有精品视频| 黑人精品欧美一区二区蜜桃| 蜜桃在线一区二区三区| 美腿丝袜在线亚洲一区| 欧美aaaaaa午夜精品| 老司机精品视频导航| 九九在线精品视频| 国产一区二区按摩在线观看| 国产精品一二三区| 成人午夜视频福利| 欧美一区二区三区小说| 日韩精品一区二区三区视频播放| 欧美一区二区三区在线看| 日韩欧美一区在线| 精品国产91亚洲一区二区三区婷婷| 日韩欧美一区二区在线视频| 26uuu久久综合| 国产精品婷婷午夜在线观看| 国产精品久久久久婷婷| 亚洲女子a中天字幕| 亚洲高清不卡在线| 久久精品国产澳门| 国产精品99久| 一本久道久久综合中文字幕 | 成人午夜av在线| 成人深夜在线观看| 色婷婷av一区| 7878成人国产在线观看| 26uuu亚洲婷婷狠狠天堂| 国产精品少妇自拍| 国产麻豆视频一区二区| 成人av在线资源网| 欧美性猛交一区二区三区精品| 欧美精品久久一区| 久久影院电视剧免费观看| 亚洲三级小视频| 日本成人超碰在线观看| 国产91露脸合集magnet | 欧美性一级生活| 日韩免费性生活视频播放| 欧美激情艳妇裸体舞| 亚洲高清免费观看 | 成人黄页在线观看| 在线日韩国产精品| 精品国产欧美一区二区| 亚洲精品中文字幕乱码三区 | 亚洲国产视频一区二区| 国产高清不卡二三区| 色av综合在线| www国产成人免费观看视频 深夜成人网| 国产老妇另类xxxxx| 色综合久久88色综合天天6 | 一区二区三区中文字幕| 美女在线观看视频一区二区| 成人网男人的天堂| 日韩欧美高清dvd碟片| 亚洲天堂av一区| 亚洲国产精品人人做人人爽| 国产麻豆视频精品| 欧美日韩国产片| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美巨大另类极品videosbest | 制服丝袜av成人在线看| 国产精品国产三级国产aⅴ入口| 日韩精品欧美成人高清一区二区| av在线不卡免费看| 精品人在线二区三区| 亚洲一卡二卡三卡四卡五卡| 国产成人免费在线观看不卡| 国产精品美女久久久久aⅴ| 免费成人美女在线观看.| 欧美在线观看视频在线| 国产精品福利影院| 国产黄色成人av| 亚洲精品一区二区三区四区高清| 亚洲地区一二三色| 91在线一区二区| 国产精品久久久久影院亚瑟| 国产精品正在播放| 精品福利视频一区二区三区| 日韩av午夜在线观看| 欧美性淫爽ww久久久久无| 亚洲视频香蕉人妖| 日韩国产一二三区| 欧美日韩三级视频| 亚洲一二三四在线| 欧美在线视频不卡| 亚洲国产三级在线| 欧美午夜一区二区三区免费大片| 亚洲色图欧美在线| 色一情一乱一乱一91av| 自拍视频在线观看一区二区| 99国产麻豆精品| 亚洲桃色在线一区| 色综合久久88色综合天天6 | 韩国一区二区视频| 日韩女同互慰一区二区| 久久av资源站| 久久免费看少妇高潮| 丁香婷婷综合五月| 国产精品初高中害羞小美女文| 99久久99久久免费精品蜜臀| 中文字幕一区二区三区精华液| aaa亚洲精品| 一个色在线综合| 欧美亚洲一区二区在线| 性久久久久久久| 欧美成人vps| 国产一区在线不卡| 欧美韩国一区二区| 91久久免费观看| 日韩和欧美的一区| 2019国产精品| 成人18精品视频| 亚洲国产精品自拍| 日韩欧美亚洲一区二区| 国内精品免费**视频| 国产精品国模大尺度视频| 在线精品亚洲一区二区不卡| 亚洲一卡二卡三卡四卡 | 在线观看国产一区二区| 午夜国产精品一区| 日韩色在线观看| 成人av资源站| 日本亚洲欧美天堂免费| 久久久精品国产99久久精品芒果 | 亚洲综合精品自拍| 精品久久久久久久人人人人传媒| 成人视屏免费看|