Exemple #1
0
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;
}
Exemple #2
0
	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);
	}
Exemple #3
0
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;
}
Exemple #4
0
	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);
	}
Exemple #5
0
	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);
	}
Exemple #6
0
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;
}