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

📄 possiblepoints.cpp

📁 2006年世界杯足球赛2D仿真组第16名的源代码。在此代码上随便改改
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		distMax = distMin;		distMin = a;	}	a = direction;	a += headAngle;	quantizeRange(a, 1, dirMin, dirMax);	//	//LogMaker.Log(LV_WModel,"PP CDists : " ,distMin, " " ,distMax);	//	//LogMaker.Log(LV_WModel,"PP CDirs : " ,dirMin, " " ,dirMax);	Degree::absoluteAngle(dirMin);	Degree::absoluteAngle(dirMax);	for (i = 0; i < pointsTablePW; i++)		for (j = 0; j < pointsTablePH; j++)			if (data[i + pointsTablePW * j] == maxData)			{				a = (((i + 0.5f) * dX) + left) - agentPosition.getX();				b = (((j + 0.5f) * dY) + down) - agentPosition.getY();				c = hypot(a, b);				d = Degree::arcTan2(b, a);				Degree::absoluteAngle(d);				//				//LogMaker.Log(LV_WModel,"PP addFlag CP i, j=",i," ",j);				//				//LogMaker.Log(LV_WModel,"PP addFlag CP PX, PY=",(((i+0.5f)*dX) + left)," ",(((j+0.5f)*dY) + down));				//				//LogMaker.Log(LV_WModel,"PP addFlag CP DX, DY=",a," ",b);				//				//LogMaker.Log(LV_WModel,"PP addFlag CP Dist, Dir=",c," ",d);				if (c > distMin && c < distMax)					if (Degree::isBetween(dirMin, dirMax, d)) // IsBeTwEeN cAn Be FaStEr BeCaUsE fIrSt TwO aRgUmEnTs ArE cOnStAnT mAnY tImEs					{						//						//LogMaker.Log(LV_WModel,"PP addFlag CP Added");						n++;						(data[i + pointsTablePW * j])++;					}			}	if (n > 0)		maxData++;	//	view();	//	//LogMaker.Log(LV_WModel,"addSee End maxData= ",maxData);	return n;}void PossiblePoints::setByVelocitySimulate(float velX, float velY,	float headAngle, float rand, float velDeviation){	float a, b, c, d;	float xRandMax, yRandMax;	//	LogMaker.Log(LV_WModel,"PP Set By Velocity Simulate Start");	xRandMax = velX * rand;	yRandMax = velY * rand;	xRandMax += (velDeviation) / SQRT2;	yRandMax += (velDeviation) / SQRT2;	Vector relVelVector, absVelVector;	absVelVector.setAsCartesian(velX, velY);	relVelVector.setAsCartesian(-xRandMax, -yRandMax);	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() + absVelVector.getDirection());	relVelVector = relVelVector + absVelVector;	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() - headAngle);	a = relVelVector.getX(); // xmin	b = relVelVector.getY(); // ymin	c = relVelVector.getX(); // xmax	d = relVelVector.getY(); // ymax	relVelVector.setAsCartesian(-xRandMax, yRandMax);	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() + absVelVector.getDirection());	relVelVector = relVelVector + absVelVector;	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() - headAngle);	if (relVelVector.getX() < a)		a = relVelVector.getX();	if (relVelVector.getX() > c)		c = relVelVector.getX();	if (relVelVector.getY() < b)		b = relVelVector.getY();	if (relVelVector.getY() > d)		d = relVelVector.getY();	relVelVector.setAsCartesian(xRandMax, -yRandMax);	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() + absVelVector.getDirection());	relVelVector = relVelVector + absVelVector;	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() - headAngle);	if (relVelVector.getX() < a)		a = relVelVector.getX();	if (relVelVector.getX() > c)		c = relVelVector.getX();	if (relVelVector.getY() < b)		b = relVelVector.getY();	if (relVelVector.getY() > d)		d = relVelVector.getY();	relVelVector.setAsCartesian(xRandMax, yRandMax);	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() + absVelVector.getDirection());	relVelVector = relVelVector + absVelVector;	relVelVector.setAsPolar(relVelVector.getMagnitude(),					relVelVector.getDirection() - headAngle);	if (relVelVector.getX() < a)		a = relVelVector.getX();	if (relVelVector.getX() > c)		c = relVelVector.getX();	if (relVelVector.getY() < b)		b = relVelVector.getY();	if (relVelVector.getY() > d)		d = relVelVector.getY();	a = a - VELOCITY_SAFE_AREA;	b = b - VELOCITY_SAFE_AREA;	c = c + VELOCITY_SAFE_AREA;	d = d + VELOCITY_SAFE_AREA;	initTableForVelocityByNorthEast(a, b, c - a, d - b);	//	LogMaker.Log(LV_WModel,"PP Table Inited");	//	LogMaker.Log(LV_WModel,"PP Table Inited abcd:",a," ",b," ",c," ",d);	view();	///	n = addVelocitySimulate(velX, velY, rand, velDeviation);	///	LogMaker.Log(LV_WModel,"PP Vel End N=",n);}int PossiblePoints::addVelocitySimulate(float velX, float velY,	float headAngle, float rand, float velDeviation){	float xRandMax, yRandMax;	int n = 0;	xRandMax = velX * rand;	yRandMax = velY * rand;	xRandMax += (velDeviation) / SQRT2;	yRandMax += (velDeviation) / SQRT2;	float iteration;	int posSimX, posSimY;	Vector absVelVector, relVelVector;	absVelVector.setAsCartesian(velX, velY);	iteration = dX > dY ? dY : dX;	for (float i = -xRandMax; i <= xRandMax; i += iteration)		for (float j = -yRandMax; j <= yRandMax; j += iteration)		{			relVelVector.setAsCartesian(i, j);			relVelVector.setAsPolar(relVelVector.getMagnitude(),							relVelVector.getDirection() +							absVelVector.getDirection());			relVelVector = relVelVector + absVelVector;			relVelVector.setAsPolar(relVelVector.getMagnitude(),							relVelVector.getDirection() - headAngle);			posSimX = (int) ((relVelVector.getX() - left) / dX);			posSimY = (int) ((relVelVector.getY() - down) / dY);			if (posSimX >= 0 &&				posSimX < pointsTablePW &&				posSimY >= 0 &&				posSimY < pointsTablePH)				if (data[posSimX + pointsTablePW * posSimY] == maxData)				{					data[posSimX + pointsTablePW * posSimY]++;					n++;				}		}	if (n > 0)		maxData++;	//	LogMaker.Log(LV_WModel,"Vel Sim Added N=",n);	//	LogMaker.Log(LV_WModel,"velX=",velX," velY=",velY," rand=",rand);	view();	return n;}void PossiblePoints::addVelocityDistDirChange(const Vector &headVector,	float distChng, float dirChng, float quantizeStep){	float dirChngMin, dirChngMax;	float distChngMin, distChngMax;	float a, b, c, d, e, f;	int i, j, n;	n = 0;	//	LogMaker.Log(LV_WModel,"Add DD Start");	quantizeRange(-dirChng, quantizeStep, dirChngMin, dirChngMax);	dirChngMin -= 0.2;	dirChngMax += 0.2;	//	LogMaker.Log(LV_WModel,"Add DD QDirChng:",dirChng);	//	LogMaker.Log(LV_WModel,"Add DD QDistChng:",distChng);	//	LogMaker.Log(LV_WModel,"Add DD QDirChng MM:",QDirChngMin," ",QDirChngMax);	float distanceMin, distanceMax;	a = headVector.getMagnitude();	b = log(a);	c = quantize(b, quantizeStep);	d = 0;	e = 0;	quantizeRange(c, quantizeStep, d, e);	distanceMin = exp(d);	distanceMax = exp(e);	if (distanceMin > distanceMax)	{		a = distanceMax;		distanceMax = distanceMin;		distanceMin = a;	}	//\	LogMaker.Log(LV_WModel,"Add DD distance MM:",DistanceMin," ",DistanceMax);	distChngMin = headVector.getMagnitude() * quantize(((distChng /		distanceMax)),												0.02) -		0.02;	distChngMax = headVector.getMagnitude() * quantize(((distChng /		distanceMin)),												0.02) +		0.02;	//\	LogMaker.Log(LV_WModel,"Add DD QDC MM :",QDistChngMin," ",QDistChngMax);	for (i = 0; i < pointsTablePW; i++)		for (j = 0; j < pointsTablePH; j++)			if (data[i + pointsTablePW * j] == maxData)			{				//\				LogMaker.Log(LV_WModel,"Add DD i, j CHK :",i," ",j);				a = (((i + 0.5f) * dX) + left);				b = (((j + 0.5f) * dY) + down);				//\				LogMaker.Log(LV_WModel,"Add DD a, b CHK :",a," ",b);				c = headVector.getX() / headVector.getMagnitude();				d = headVector.getY() / headVector.getMagnitude();				//\				LogMaker.Log(LV_WModel,"Add DD c, d CHK :",c," ",d);				e = (a * c) + (b * d);				f = ((-(a * d) + (b * c)) / headVector.getMagnitude()) * (180 /					PI);				//\				LogMaker.Log(LV_WModel,"Add DD e, f CHK :",e," ",f);				if (f >= dirChngMin &&					f <= dirChngMax &&					e >= distChngMin &&					e <= distChngMax)				{					if (data[i + pointsTablePW * j] == maxData)					{						n++;						(data[i + pointsTablePW * j])++;						//\						LogMaker.Log(LV_WModel,"Add DD Added");					}				}			}	if (n > 0)		maxData++;	view();	//		return n;}void PossiblePoints::quantizeRange(float v, float q, float &min, float &max){	min = v - (q / 2);	max = v + (q / 2);}float PossiblePoints::quantize(float v, float q){	return (rint(v / q)) * q;}void PossiblePoints::setMode(int mode)  // 1 *= player 2 *= ball{	if (mode == 1)	{		pointsTablePDX = POINTS_TABLE_PPDX;		pointsTablePDY = POINTS_TABLE_PPDY;	}	else if (mode == 2)	{		pointsTablePDX = POINTS_TABLE_BPDX;		pointsTablePDY = POINTS_TABLE_BPDY;	}	else	{		pointsTablePDX = POINTS_TABLE_BPDX;		pointsTablePDY = POINTS_TABLE_BPDY;	}}Vector PossiblePoints::calculateBodyPosition(const Body &body,	const FieldFlag **flags, int nFlags, float &retPosDeviation,	float quantizeStep){	Vector pos;	setMode(1);	setByFlags(flags, nFlags, body.getHeadDir(), quantizeStep);	if (body.getPosDeviation() < VALID_POS_DEVIATION)		addPositionSimulate(body.getPos().getX(), body.getPos().getY(),			body.getVel().getX(), body.getVel().getY(), body.getRand(),			body.getPosDeviation(), 0);	calculate();	pos.setAsCartesian(xAverage, yAverage);	retPosDeviation = sqrt(((xDeviation * xDeviation) +		(yDeviation * yDeviation))) /		2;	destroy();	return pos;}Vector PossiblePoints::calculatePlayerPosition(const Player &player,	const Body &body, float &retPosDeviation, float quantizeStep){	Vector pos;	setMode(1);	setBySee(player.getSeeDistance(), player.getSeeDirection(),		body.getHeadDir(), body.getPos(), quantizeStep);	if (player.getPosDeviation() < VALID_POS_DEVIATION)		addPositionSimulate(player.getPos().getX(), player.getPos().getY(),			player.getVel().getX(), player.getVel().getY(), player.getRand(),			player.getPosDeviation(), 0);	calculate();	pos.setAsCartesian(xAverage, yAverage);	retPosDeviation = sqrt(((xDeviation * xDeviation) +		(yDeviation * yDeviation))) /		2;	destroy();	return pos;}Vector PossiblePoints::calculateBallPosition(const Ball &ball,	const Body &body, float &retPosDeviation, float quantizeStep){	Vector pos;	setMode(2);	setBySee(ball.getSeeDistance(), ball.getSeeDirection(), body.getHeadDir(),		body.getPos(), quantizeStep);	if (ball.getPosDeviation() < VALID_POS_DEVIATION)		addPositionSimulate(ball.getPos().getX(), ball.getPos().getY(),			ball.getVel().getX(), ball.getVel().getY(), ball.getRand(),			ball.getPosDeviation(), 0);	calculate();	pos.setAsCartesian(xAverage, yAverage);	retPosDeviation = sqrt(((xDeviation * xDeviation) +		(yDeviation * yDeviation))) /		2;	destroy();	return pos;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -