📄 possiblepoints.cpp
字号:
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 + -