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; }
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; }
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; }