📄 possiblepoints.cpp
字号:
}int PossiblePoints::addFlag(const FieldFlag* flag, float headAngle, float quantizeStep){ int i, j; int n = 0; float a, b, c, d, e; float distMin, distMax, dirMin, dirMax; float flagX = 0, flagY = 0; // //LogMaker.Log(LV_WModel,"addFlag Start maxData= ",maxData); a = flag->getSeeDistance(); b = log(a); c = quantize(b, quantizeStep); // .1 = flag_quantize_step quantizeRange(c, quantizeStep, d, e); // .1 = flag_quantize_step distMin = exp(d); distMax = exp(e); if (distMin > distMax) { a = distMax; distMax = distMin; distMin = a; } a = flag->getSeeDirection(); a += headAngle; quantizeRange(a, 1, dirMin, dirMax); flagX = flag->getPos().getX(); flagY = flag->getPos().getY(); // //LogMaker.Log(LV_WModel,"addFlag flagX, flagY= ",flagX," ",flagY); // //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 = flagX - (((i + 0.5f) * dX) + left); b = flagY - (((j + 0.5f) * dY) + down); 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,"addFlag End maxData= ",maxData); return n;}void PossiblePoints::calculate(){ int i, j; if (maxData == 0) return; float sumX = 0; float sumY = 0; float sumDeviationX = 0; float sumDeviationY = 0; float N = 0; //LogMaker.Log(LV_WModel,"calculate Start"); //LogMaker.Log(LV_WModel,"maxData=",maxData); view(); for (i = 0; i < pointsTablePW; i++) for (j = 0; j < pointsTablePH; j++) if (data[i + pointsTablePW * j] == maxData) { //LogMaker.Log(LV_WModel,"AddPoint D, getX(),getY() = ",data[i+pointsTablePW * j]," ",i," ",j); // //LogMaker.Log(LV_WModel," ", ( ((float)(data[i][j])) /max)); // sumX+=((i * dX) + left)* ( ((float)(data[i][j])) /max) ; // sumDeviationX+=(((i * dX) + left)*((i * dX) + left))* ( ((float)(data[i][j])) /max); // sumY+=((j * dY) + down)* ( ((float)(data[i][j])) /max); // sumDeviationY+=(((j * dY) + down)*((j * dY) + down))* ( ((float)(data[i][j])) /max); // N+=( ( ((float)(data[i][j])) /max)); // //LogMaker.Log(LV_WModel,"PP Calc AddPoint D, getX(),getY() = ",data[i][j]," ",i," ",j); // //LogMaker.Log(LV_WModel,"PP Calc AddPoint PX, PY = ",((i+0.5f)*dX) + left," ",((j+0.5f)*dY) + down); sumX += (((i + 0.5f) * dX) + left); sumDeviationX += ((((i + 0.5f) * dX) + left) * (((i + 0.5f) * dX) + left)); sumY += (((j + 0.5f) * dY) + down); sumDeviationY += ((((j + 0.5f) * dY) + down) * (((j + 0.5f) * dY) + down)); N += 1; } //LogMaker.Log(LV_WModel,"PP Calc sumX, sumY, N=",sumX," ",sumY," ",N); //LogMaker.Log(LV_WModel,"PP Calc sumDeviationX, sumDeviationY, N=",sumDeviationX," ",sumDeviationY," ",N); xAverage = (sumX / N); yAverage = (sumY / N); //LogMaker.Log(LV_WModel,"PP Calc XA, YA=",xAverage," ",yAverage); xDeviation = (sumDeviationX / N) - (xAverage * xAverage); yDeviation = (sumDeviationY / N) - (yAverage * yAverage); //LogMaker.Log(LV_WModel,"PP Calc XD, YD=",xDeviation," ",yDeviation); xDeviation = sqrt(fabs(xDeviation)); yDeviation = sqrt(fabs(yDeviation)); //LogMaker.Log(LV_WModel,"PP Calc XD, YD=",xDeviation," ",yDeviation); //LogMaker.Log(LV_WModel,"calculate End");}int PossiblePoints::addPositionSimulate(float x, float y, float velX, float velY, float rand, float posDeviation, float velDeviation){ float xRandMax, yRandMax; int n = 0; //LogMaker.Log(LV_WModel,"Pos Sim Start getX()=",getX()," getY()=",getY()); //LogMaker.Log(LV_WModel,"Pos Sim Start PD=",posDeviation," VD=",velDeviation); xRandMax = velX * rand; yRandMax = velY * rand; xRandMax += (posDeviation + velDeviation) / SQRT2; yRandMax += (posDeviation + velDeviation) / SQRT2; //LogMaker.Log(LV_WModel,"Pos Sim XYRandMax=",xRandMax," ",yRandMax); float iteration; int posSimX, posSimY; Vector absVelVector, relVelVector; absVelVector.setAsCartesian(velX, velY); iteration = dX > dY ? dY : dX; if (iteration < pointsTablePDX / 2) iteration = pointsTablePDX / 2; if (iteration < pointsTablePDY / 2) iteration = pointsTablePDY / 2; //LogMaker.Log(LV_WModel,"Pos Sim iteration=",iteration); for (float i = -xRandMax; i <= xRandMax; i += iteration) for (float j = -yRandMax; j <= yRandMax; j += iteration) { relVelVector.setAsCartesian(i, j); relVelVector.rotate(-(absVelVector.getDirection())); posSimX = (int) ((relVelVector.getX() + x - left) / dX); posSimY = (int) ((relVelVector.getY() + y - down) / dY); //LogMaker.Log(LV_WModel,"Pos Sim i, j=",i," ",j); //LogMaker.Log(LV_WModel,"Pos Sim posSimX, posSimY=",posSimX," ",posSimY); if (posSimX >= 0 && posSimX < pointsTablePW && posSimY >= 0 && posSimY < pointsTablePH) if (data[posSimX + pointsTablePW * posSimY] == maxData) { data[posSimX + pointsTablePW * posSimY]++; //LogMaker.Log(LV_WModel,"Pos Sim Added"); n++; } } if (n > 0) maxData++; //LogMaker.Log(LV_WModel,"Pos Sim Added N=",n," getX()=",getX()," getY()=",getY()); //LogMaker.Log(LV_WModel,"velX=",velX," velY=",velY," rand=",rand); return n;}void PossiblePoints::setBySee(float distance, float direction, float headAngle, const Vector &agentPosition, float quantizeStep){ float a, b, c, d, e; float distMin, distMax, dirMin, dirMax; Vector ray; //LogMaker.Log(LV_WModel,"PP See Start "); // Initialize Table With Nearest flag a = distance; b = log(a); c = quantize(b, quantizeStep); // .1 = flag_quantize_step d = 0; e = 0; quantizeRange(c, quantizeStep, d, e); // .1 = flag_quantize_step distMin = exp(d); distMax = exp(e); if (distMin > distMax) { a = distMax; distMax = distMin; distMin = a; } // //LogMaker.Log(LV_WModel,"PP See Dist MM=",distMin," ",distMax); a = direction; a += headAngle; quantizeRange(a, 1, dirMin, dirMax); // //LogMaker.Log(LV_WModel,"PP headAngle=",headAngle); // //LogMaker.Log(LV_WModel,"PP See Dir MM=",dirMin," ",dirMax); ray.setAsPolar(distMin, dirMin); ray = ray + agentPosition; a = ray.getX(); // xmin b = ray.getY(); // ymin c = ray.getX(); // xmax d = ray.getY(); // ymax // //LogMaker.Log(LV_WModel,"PP See 1XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 1YMin YMax=",b," ",d); ray.setAsPolar(distMin, dirMax); ray = ray + agentPosition; if (ray.getX() < a) a = ray.getX(); if (ray.getX() > c) c = ray.getX(); if (ray.getY() < b) b = ray.getY(); if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 2XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 2YMin YMax=",b," ",d); ray.setAsPolar(distMax, dirMin); ray = ray + agentPosition; if (ray.getX() < a) a = ray.getX(); if (ray.getX() > c) c = ray.getX(); if (ray.getY() < b) b = ray.getY(); if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 3XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 3YMin YMax=",b," ",d); ray.setAsPolar(distMax, dirMax); ray = ray + agentPosition; if (ray.getX() < a) a = ray.getX(); if (ray.getX() > c) c = ray.getX(); if (ray.getY() < b) b = ray.getY(); if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 4XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 4YMin YMax=",b," ",d); Degree::absoluteAngle(dirMin); Degree::absoluteAngle(dirMax); if (Degree::isBetween(dirMin, dirMax, 90)) { ray.setAsPolar(distMax, 90); ray = ray + agentPosition; // if (ray.getX() < a) a = ray.getX(); // if (ray.getX() > c) c = ray.getX(); if (ray.getY() < b) b = ray.getY(); if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 5XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 5YMin YMax=",b," ",d); } if (Degree::isBetween(dirMin, dirMax, 270)) { ray.setAsPolar(distMax, -90); ray = ray + agentPosition; // if (ray.getX() < a) a = ray.getX(); // if (ray.getX() > c) c = ray.getX(); if (ray.getY() < b) b = ray.getY(); if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 6XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 6YMin YMax=",b," ",d); } if (Degree::isBetween(dirMin, dirMax, 0)) { ray.setAsPolar(distMax, 0); ray = ray + agentPosition; if (ray.getX() < a) a = ray.getX(); if (ray.getX() > c) c = ray.getX(); // if (ray.getY() < b) b = ray.getY(); // if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 7XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 7YMin YMax=",b," ",d); } if (Degree::isBetween(dirMin, dirMax, 180)) { ray.setAsPolar(distMax, 180); ray = ray + agentPosition; if (ray.getX() < a) a = ray.getX(); if (ray.getX() > c) c = ray.getX(); // if (ray.getY() < b) b = ray.getY(); // if (ray.getY() > d) d = ray.getY(); // //LogMaker.Log(LV_WModel,"PP See 8XMin XMax=",a," ",c); // //LogMaker.Log(LV_WModel,"PP See 8YMin YMax=",b," ",d); } initTableByNorthEast(a, b, c - a, d - b); // //LogMaker.Log(LV_WModel,"PP Table Inited"); // view(); int n; n = addSee(distance, direction, headAngle, agentPosition, quantizeStep); //LogMaker.Log(LV_WModel,"PP See End N=",n);}int PossiblePoints::addSee(float distance, float direction, float headAngle, const Vector &agentPosition, float quantizeStep){ int i, j; int n = 0; float a, b, c, d, e; float distMin, distMax, dirMin, dirMax; // //LogMaker.Log(LV_WModel,"addSee Start maxData= ",maxData); a = distance; b = log(a); c = quantize(b, quantizeStep); // .1 = flag_quantize_step d = 0; e = 0; quantizeRange(c, quantizeStep, d, e); // .1 = flag_quantize_step distMin = exp(d); distMax = exp(e); if (distMin > distMax) { a = distMax;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -