static int BuildEllipse2(REAL8 xmajor_a, REAL8 yminor_b, REAL8 angle) { int i,nrLines,xCeil; int lineStart,lineEndIncl; REAL8 xIncr,c=cos(angle),s=sin(angle); HOR_CUT_LINE *l; PRECOND(xmajor_a != 0); PRECOND(yminor_b != 0); xmajor_a /= Side(); yminor_b /= Side(); xCeil = (size_t)ceil(xmajor_a); nrLines = (xCeil*2)+1; l = (HOR_CUT_LINE *)ChkMalloc(sizeof(HOR_CUT_LINE)*nrLines); for(i=0; i < nrLines; i++) { /* mark not initialized */ SET_MV_REAL4(&(l[i].start.f)); } for (xIncr = 0; xIncr < xCeil; xIncr+=1) { REAL8 y = sqrt( fabs(1-(sqr(xIncr)/sqr(xmajor_a)))*sqr(yminor_b)); Add2Lines(l,nrLines,xCeil,c,s, xIncr, y); Add2Lines(l,nrLines,xCeil,c,s, xIncr,-y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr, y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr,-y); } if (0) { REAL8 y; xIncr = xmajor_a; y = sqrt( fabs(1-(sqr(xIncr)/sqr(xmajor_a)))*sqr(yminor_b)); Add2Lines(l,nrLines,xCeil,c,s, xIncr, y); Add2Lines(l,nrLines,xCeil,c,s, xIncr,-y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr, y); Add2Lines(l,nrLines,xCeil,c,s,-xIncr,-y); } for(i=0; i < nrLines; i++) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i < nrLines); lineStart = i; for(i = nrLines-1; i >=0;i--) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i >= 0); lineEndIncl = i; for (i=lineStart ; i <= lineEndIncl; i++) { PRECOND(!IS_MV_REAL4(&(l[i].start.f))); l[i].start.i = (int)Rint(l[i].start.f); l[i].end.i = (int)Rint(l[i].end.f); } return 1; }
virtual int draw(Pint _pos,bool _active=true,dxDMode _mode=dxDMode()){ // dx::TmpGlobalStd gstd(_pos+dx::getGlobalStd()); dx::TmpDrawArea DA(dxDArea(Rint(_pos,_pos+size))&dx::getDrawArea()); // dx::TmpDrawMode DM(_mode+dx::getDrawMode()); // dx::draw(_pos,dxoBox(size,dxHLS(0,128,128)),128); dxO dxo(_pos,_active,_mode,this); return (*pDrawFunc)(dxo); }
static int BuildCircle(REAL8 radius) { int i,nrLines,xFloor; REAL8 xIncr,lineStart,lineEndIncl; HOR_CUT_LINE *l; PRECOND(radius != 0); radius /= (Side()*2); xFloor = (size_t)floor(radius); radius *= radius; nrLines = (xFloor*2)+1; l = (HOR_CUT_LINE *)ChkMalloc(sizeof(HOR_CUT_LINE)*nrLines); for(i=0; i < nrLines; i++) { /* mark not initialized */ SET_MV_REAL4(&(l[i].start.f)); } for (xIncr = 0; xIncr <= xFloor; xIncr+=1) { REAL8 y = floor(sqrt(radius-sqr(xIncr))); Add2Lines(l,nrLines,xFloor,1,0, xIncr, y); Add2Lines(l,nrLines,xFloor,1,0, xIncr,-y); Add2Lines(l,nrLines,xFloor,1,0,-xIncr, y); Add2Lines(l,nrLines,xFloor,1,0,-xIncr,-y); } for(i=0; i < nrLines; i++) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i < nrLines); lineStart = i; for(i = nrLines-1; i >=0;i--) { /* mark not initialized */ if (!IS_MV_REAL4(&(l[i].start.f))) break; } POSTCOND(i >= 0); lineEndIncl = i; for (i=(int)lineStart ; i <= (int)lineEndIncl; i++) { PRECOND(!IS_MV_REAL4(&(l[i].start.f))); l[i].start.i = (int)Rint(l[i].start.f); l[i].end.i = (int)Rint(l[i].end.f); } return 1; }
virtual int draw(Pint _pos,bool _active=true,dxDMode _mode=dxDMode()){ if(!_active)_mode+=Passive; dx::drawBox(_pos,_pos+size,Clr,1,_mode+In); dx::drawBox(_pos,_pos+size,Clr,0,_mode+Out); dx::drawBox(_pos+Pint(0,dx::getFontSize()*-1),_pos+Pint(size.x,0),Clr,1,_mode+Out); dx::drawStr(_pos+Pint(2,dx::getFontSize()*-1),name,dxRGB(255,255,255),_mode+Out); dx::TmpDrawArea DA(dxDArea(Rint(_pos,_pos+size))&dx::getDrawArea()); dxO dxo(_pos,_active,_mode,this); return drawIn(dxo,pDrawFunc); }
virtual int draw(Pint _pos,bool _active=true,dxDMode _mode=dxDMode()){ // if(status<0)return 0; // else if(status==0)_mode+=Passive; if(!_active)_mode+=Passive; dx::drawBox(_pos,_pos+size,Clr,1,_mode+In); dx::drawBox(_pos,_pos+size,Clr,0,_mode+Out); dx::TmpDrawArea DA(dxDArea(Rint(_pos,_pos+size))&dx::getDrawArea()); // dxO dxo(_pos,_mode,status>0,this); dxO dxo(_pos,_active,_mode,this); return drawIn(dxo,pDrawFunc); }
bool ActionEffector::SetDashAction(double power, AngleDeg dir) { Assert(dir > -180.0 - FLOAT_EPS && dir < 180.0 + FLOAT_EPS); if (mIsDash == true || mIsMutex == true) { return false; } power = GetNormalizeDashPower(power); dir = GetNormalizeDashAngle(dir); // 注意,在rcssserver13.1.0版本下,dash只需要考虑下面四种情况即可: // @ -power 0.0 // @ +power 0.0 // @ +power 90.0 // @ +power -90.0 // // from rcssserver13.1.0 // 注意,在rcssserver v14 下,dash需要考虑的情况包括: // @ +power, 0 // @ +power, 45 // @ +power, 90 // @ +power, 135 | -power, -45 // @ -power, 0 | +power, 180 // @ +power, -45 // @ +power, -90 // @ -power, 45 | +power, -135 if (ServerParam::instance().dashAngleStep() < FLOAT_EPS ) { // players can dash in any direction. } else { // The dash direction is discretized by server::dash_angle_step dir = ServerParam::instance().dashAngleStep() * Rint(dir / ServerParam::instance().dashAngleStep()); } TransformDash(power, dir); double max_stamina = mSelfState.GetStamina() + mSelfState.GetExtraStamina(); if (power < 0.0) { if ((-2.0 * power) > max_stamina) { power = -max_stamina * 0.5 + FLOAT_EPS; } } else { if (power > max_stamina) { power = max_stamina - FLOAT_EPS; } } if (!mAgent.GetSelf().IsOutOfStamina()) { power = mAgent.GetSelf().CorrectDashPowerForStamina(power); // 保证不降到最低体力以下 } if (std::fabs(power) < FLOAT_EPS) return false; TransformDash(power, dir); mDash.Plan(power, dir); mDash.Execute(mCommandQueue); ++mDashCount; mIsDash = true; mIsMutex = true; return true; }