Exemplo n.º 1
0
double BoundedPair::Radious(const int iTap1, const int iTap2, const double dMicR1, const double dMicR2,
		cv::Point2d &point1, cv::Point2d &point2, CPolygon* poly1, CPolygon *poly2)
{//during the computation: point1 & dRadious1 => smaller circle
	//point2 & dRadious2 => larger circle
	//bXchange => swap or not
	bool bXchange1 = false;
	double dRadi = 0.0;
	double dDist = std::sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y));
	double dRadi1 = dMicR1;//min of the given radious
	if(dMicR1 > dMicR2)
	{
		bXchange1 = true;
		dRadi1 = dMicR2;
	}
	
	double dRate = RateOf(iTap1, iTap2);
	Point point1Tmp, point2Tmp;
	std::pair<Point, Point> pairTmp = poly1->CommonEdge(*poly2);
	Point pointCenter1, pointCenter2;
	double dRTmp1 = poly1->TriEdgeCircleR(pairTmp.first, pairTmp.second, pointCenter1);
	double dRTmp2 = poly2->TriEdgeCircleR(pairTmp.first, pairTmp.second, pointCenter2);
	double dRadi2 = dRTmp1;//min of the new radi
	bool bXchange2 = false;
	if(dRTmp1 > dRTmp2)
	{
		bXchange2 = true;
		dRadi2 = dRTmp2;
	}
	cv::Point2d pointTmp1, pointTmp2;
	bool bXchange = false;
	if(dRadi1 > dRadi2)
	{//3LineCircle is small
		dRadi = dRadi2;
		dDist = std::sqrt((pointCenter1.x()-pointCenter2.x())*(pointCenter1.x()-pointCenter2.x()) +
			(pointCenter1.y()-pointCenter2.y())*(pointCenter1.y()-pointCenter2.y()));
		if(bXchange2)
		{
			bXchange = true;
			//pointTmp1 = cv::Point2d(pointCenter2.x(), pointCenter2.y());
			//pointTmp2 = cv::Point2d(pointCenter1.x(), pointCenter1.y());
			point1 = cv::Point2d(pointCenter2.x(), pointCenter2.y());
			point2 = cv::Point2d(pointCenter1.x(), pointCenter1.y());
			dRadi1 += dRadi2;
			dRadi2 = dRadi1 - dRadi2;
			dRadi1 = dRadi1 - dRadi2;
		}
		else
		{
			point1 = cv::Point2d(pointCenter1.x(), pointCenter1.y());
			point2 = cv::Point2d(pointCenter2.x(), pointCenter2.y());
			pointTmp1 = cv::Point2d(pointCenter1.x(), pointCenter1.y());
			pointTmp2 = cv::Point2d(pointCenter2.x(), pointCenter2.y());
		}
	}
	else
	{//MIC is small
		dRadi = dRadi1;
		if(bXchange1)
		{
			bXchange = true;
			cv::Point2d poinTmp = point1;
			//pointTmp1 = point2;
			//pointTmp2 = point1;
			point1 = point2;
			point2 = poinTmp;
			//
			dRadi1 = dMicR2;
			dRadi2 = dMicR1;
		}
		else
		{
			//pointTmp1 = point1;
			//pointTmp2 = point2;
			dRadi1 = dMicR1;
			dRadi2 = dMicR2;
		}
	}
	//Radi & circle center computation
	//dRadi1 ~ point1 | small M
	//dRadi2 ~ point2 | big   N

	//cross point(dXTmp, dYTmp)
	double dXTmp, dYTmp;
	//vectorMN : point1 -> point2
	cv::Point2d vectorMN = cv::Point2d((point2.x-point1.x)/dDist, (point2.y-point1.y)/dDist);
	if( LinesCross(pairTmp.first.x(), pairTmp.first.y(), pairTmp.second.x(), pairTmp.second.y(),
		pointTmp1.x, pointTmp1.y, pointTmp2.x, pointTmp2.y, dXTmp, dYTmp) )
	{
		if((dDist < dRadi*dRate) && (dDist + std::abs(dRadi2 - dRadi1)) < dRadi*dRate)
		{//not enought space. dRadi = (dDist + dRadious2 - dRadious1)/dRate;
				//dDist = dDist + dRadious2 - dRadiou1
				dRadi = (dDist + std::abs(dRadi2 - dRadi1))/dRate;
		}
		//point1 = crossPoint - 0.5*dRadi*dRate*MN
		//point2 = crossPoint + 0.5*dRadi*dRate*MN
		point1.x = dXTmp - vectorMN.x*dRadi*dRate*0.5;
		point1.y = dYTmp - vectorMN.y*dRadi*dRate*0.5;
		point2.x = dXTmp + vectorMN.x*dRadi*dRate*0.5;
		point2.y = dYTmp + vectorMN.y*dRadi*dRate*0.5;		
	}
	else
	{
		std::cerr<< "No cross point"<< std::endl;
	}
	//if(dRate == 2)
	//{
	//	if((dDist - dRadious1 - dRadious2) > 0 )
	//	{// got a gap between the 2 circles
	//		std::pair<Point, Point> pairTmp = poly1->CommonEdge(*poly2);

	//	}
	//}
	//else
	//{

	//}
	if(bXchange)
	{
		cv::Point2d poinTmp = point1;
		//pointTmp1 = point2;
		//pointTmp2 = point1;
		point1 = point2;
		point2 = poinTmp;
	}

	ClearMapRadi(iTap1, iTap2);

	return dRadi;
}
Exemplo n.º 2
0
bool aimbot::Think(UserCmd *ucmd)
{
	Entity *lp = LocalPlayer();
	Entity *t  = nullptr;

	float best = 3.40282347e+38f;

	weaponinfo = lp->GetActiveWeapon()->GetWeaponInfo();


	Vector aim, tp, sp = lp->GetShootPos();
	AngleVectors(ucmd->viewangles, aim);

	BulletFilter bf(lp);

	for (int i = 1, ignore = engine->GetLocalPlayer(), players = globals->maxclients();
#ifdef NPCS
		i <= ents->GetMaxEntities();
#else
		i <= globals->maxclients();
#endif
		i++)
	{
		if (i == ignore)
			continue;

		if (Entity *pl = ents->GetEntity(i))
		{
			if (pl->IsDormant())
				continue;

			if (i > players)
				continue;

			if (!CheckTarget(lp, pl))
				continue;

			if (!pl->GetModel())
				continue;

			if (!pl->SetupBones())
				continue;

			float rate = RateOf(ucmd, lp, pl, i);
			if (rate >= best)
				continue;

			bf.against(pl);

			bool next = false;
			int index = 0;

			for (int j = pl->Hitboxes() - 1; j >= 0; j--)
			{
				hitbox *box = pl->GetHitbox(j);

				if (box->group == HITGROUP_HEAD)
				{
					Vector pos = pl->GetBoxPos(box);

					if (BulletTrace(sp, pos, &bf))
					{
						t  = pl;
						tp = pos;

						best = rate;
						shot = i;

						next = true;
					}

					index = j;
					break;
				}
			}

			if (!next && 1) // menu.aimbot.hitscan
			{
				for (int j = 0; j < pl->Hitboxes(); j++)
				{
					if (j == index)
						continue;

					hitbox *box = pl->GetHitbox(j);

					if (box->group && box->group != HITGROUP_HEAD)
					{
						Vector pos = pl->GetBoxPos(box);

						if (BulletTrace(sp, pos, &bf))
						{
							t  = pl;
							tp = pos;

							best = rate;
							shot = i;

							break;
						}
					}
				}
			}
		}
	}

	if (t != nullptr)
	{
		VectorAngles(tp - sp, ucmd->viewangles);

		//if (1) // menu.aimbot.autoshot
		//	ucmd->buttons.add(IN_ATTACK);

		return true;
	}

	return false;
}
Exemplo n.º 3
0
double BoundedPair::Radious(const int iTap1, const int iTap2, 
							const double dMicR1, const double dMicR2,
							cv::Point2d &point1, cv::Point2d &point2)//Mic center
{//
	double dDist = std::sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y));
	if(dDist <= 1e-12 && dDist >= -1e-12)
	{
		return 0.0;
	}
	double dRTmp = std::abs(dMicR1);
	bool bXchange = false;
	double dRate = RateOf(iTap1, iTap2);

	int iTapTmp1 = iTap1, iTapTmp2 = iTap2;
	cv::Point2d vectorMN;
	cv::Point2d point0;
	if(std::abs(dMicR1) > std::abs(dMicR2))//set origin
	{
		dRTmp = std::abs(dMicR2);
		bXchange = true;
		iTapTmp1 = iTap2;
		iTapTmp2 = iTap1;
		vectorMN = cv::Point2d((point1.x-point2.x)/dDist, (point1.y-point2.y)/dDist);
		point0 = cv::Point2d((point2.x - vectorMN.x*dMicR2), (point2.y - vectorMN.y*dMicR2));
	}
	else
	{
		vectorMN = cv::Point2d((point2.x-point1.x)/dDist, (point2.y-point1.y)/dDist);
		point0 = cv::Point2d((point1.x - vectorMN.x*dMicR1), (point1.y - vectorMN.y*dMicR1));		
	}

	//check doable: dRate>2 ?
	
	assert(dRate >= 2.0);
	if((dDist < dRTmp*dRate) 
		&& ((dDist + std::abs(dMicR1-dMicR2)) > dRTmp*dRate))
	{
		double dRadiOld = dRTmp;
		dRTmp = (dDist - std::abs(dMicR1-dMicR2))/dRate;
		//circle heart refresh
		point1 = point0 + (2*dRadiOld-dRTmp)*vectorMN;
		point2 = point1 + dRate*dRTmp*vectorMN;		
	}
	else if((dDist > dRTmp*dRate) 
		&& ((dDist-std::abs(dMicR1-dMicR2)) > dRTmp*dRate))
	{//?
		double dRadiOld = dRTmp;
		dRTmp = (dDist - (dMicR1+dMicR2-dRTmp))/(dRate-1.0);
		//circle heart refresh
		point1 = point0 + (2*dRadiOld-dRTmp)*vectorMN;
		point2 = point1 + dRate*dRTmp*vectorMN;
	}
	else
	{
		//circle heart refresh
		point1 = point0 + dRTmp*vectorMN;
		point2 = point0 + (1+dRate)*dRTmp*vectorMN;
	}

	if(bXchange)
	{
		cv::Point2d pointTmp = point1;
		point1 = point2;
		point2 = pointTmp;
	}
#ifdef _DEBUG
//	if(dRTmp > dRadious1 || dRTmp > dRadious2)
//		cout<< "Error : recomputaion"<< endl;
#endif

	ClearMapRadi(iTap1, iTap2);

	return dRTmp;
}