//-------------------------------------------------------------- //copy map (of GridWorld)to maze (of LPA*) void copyDisplayMapToMaze(GridWorld &gWorld, LpaStar* lpa){ for(int i=0; i < gWorld.getGridWorldRows(); i++){ for(int j=0; j < gWorld.getGridWorldCols(); j++){ lpa->maze[i][j].type = gWorld.map[i][j].type; lpa->maze[i][j].x = gWorld.map[i][j].col; lpa->maze[i][j].y = gWorld.map[i][j].row; //lpa->maze[i][j].g = gWorld.map[i][j].g; //lpa->maze[i][j].rhs = gWorld.map[i][j].rhs; } } vertex startV = gWorld.getStartVertex(); vertex goalV = gWorld.getGoalVertex(); //lpa->start->g = gWorld.map[startV.row][startV.col].g ; //lpa->start->rhs = gWorld.map[startV.row][startV.col].rhs ; lpa->start->x = gWorld.map[startV.row][startV.col].col; lpa->start->y = gWorld.map[startV.row][startV.col].row; //lpa->goal->g = gWorld.map[goalV.row][goalV.col].g; //lpa->goal->rhs = gWorld.map[goalV.row][goalV.col].rhs; lpa->goal->x = gWorld.map[goalV.row][goalV.col].col; lpa->goal->y = gWorld.map[goalV.row][goalV.col].row; }
//-------------------------------------------------------------- //copy maze (from LPA*) to map (of GridWorld) void copyMazeToDisplayMap(GridWorld &gWorld, LpaStar* lpa){ for(int i=0; i < gWorld.getGridWorldRows(); i++){ for(int j=0; j < gWorld.getGridWorldCols(); j++){ gWorld.map[i][j].type = lpa->maze[i][j].type; gWorld.map[i][j].h = lpa->maze[i][j].h; gWorld.map[i][j].g = lpa->maze[i][j].g; gWorld.map[i][j].rhs = lpa->maze[i][j].rhs; gWorld.map[i][j].row = lpa->maze[i][j].y; gWorld.map[i][j].col = lpa->maze[i][j].x; for(int k=0; k < 2; k++){ gWorld.map[i][j].key[k] = lpa->maze[i][j].key[k]; } } } gWorld.map[lpa->start->y][lpa->start->x].h = lpa->start->h; gWorld.map[lpa->start->y][lpa->start->x].g = lpa->start->g; gWorld.map[lpa->start->y][lpa->start->x].rhs = lpa->start->rhs; gWorld.map[lpa->start->y][lpa->start->x].row = lpa->start->y; gWorld.map[lpa->start->y][lpa->start->x].col = lpa->start->x; for(int k=0; k < 2; k++){ gWorld.map[lpa->start->y][lpa->start->x].key[k] = lpa->start->key[k]; } gWorld.map[lpa->goal->y][lpa->goal->x].h = lpa->goal->h; gWorld.map[lpa->goal->y][lpa->goal->x].g = lpa->goal->g; gWorld.map[lpa->goal->y][lpa->goal->x].rhs = lpa->goal->rhs; gWorld.map[lpa->goal->y][lpa->goal->x].row = lpa->goal->y; gWorld.map[lpa->goal->y][lpa->goal->x].col = lpa->goal->x; for(int k=0; k < 2; k++){ gWorld.map[lpa->goal->y][lpa->goal->x].key[k] = lpa->goal->key[k]; } }
void runSimulation(char *fileName){ WorldBoundaryType worldBoundary; //duplicated in GridWorld DevBoundaryType deviceBoundary; //duplicated in GridWorld bool ANIMATE_MOUSE_FLAG=false; bool validCellSelected=false; static BOOL page=false; int mX, mY; float worldX, worldY; worldX=0.0f; worldY=0.0f; int action=-1; //----------------------- CellPosition p; int rowSelected, colSelected; //----------------------- rowSelected=-1; colSelected=-1; int mouseRadius=1; srand(time(NULL)); // Seed the random number generator //Initialise the world boundaries grid_world.initSystemOfCoordinates(); grid_world.loadMapAndDisplay(fileName); grid_world.initialiseMapConnections(); //---------------------------------------------------------------- //LPA* lpa_star = new LpaStar(grid_world.getGridWorldRows(), grid_world.getGridWorldCols()); vertex start = grid_world.getStartVertex(); vertex goal = grid_world.getGoalVertex(); cout << "(start.col = " << start.col << ", start.row = " << start.row << ")" << endl; cout << "(goal.col = " << goal.col << ", goal.row = " << goal.row << ")" << endl; lpa_star->initialise(start.col, start.row, goal.col, goal.row); //lpa_star->copyMazeToDisplayMap(grid_world); //copyMazeToDisplayMap(grid_world, lpa_star); copyDisplayMapToMaze(grid_world, lpa_star); //---------------------------------------------------------------- worldBoundary = grid_world.getWorldBoundary(); deviceBoundary = grid_world.getDeviceBoundary(); GRIDWORLD_ROWS = grid_world.getGridWorldRows(); GRIDWORLD_COLS = grid_world.getGridWorldCols(); //setvisualpage(page); // keep running the program until the ESC key is pressed while((GetAsyncKeyState(VK_ESCAPE)) == 0 ) { setactivepage(page); cleardevice(); action = getKey(); if(SHOW_MAP_DETAILS) grid_world.displayMapWithDetails(); else grid_world.displayMap(); switch(action){ case 1: //Block selected cell if( rowSelected != -1 && colSelected != -1){ grid_world.setMapTypeValue(rowSelected-1, colSelected-1, '1'); grid_world.initialiseMapConnections(); rowSelected=-1; colSelected=-1; } action = -1; break; case 105: grid_world.displayMapWithKeyDetails(); break; case 106: //~ algorithmSelection = ASTAR_ALGORITHM; break; case 107: //~ algorithmSelection = LPASTAR_ALGORITHM; break; case 108: //~ algorithmSelection = DSTAR_ALGORITHM; break; case 15: if( rowSelected != -1 && colSelected != -1){ grid_world.displayVertexConnections(colSelected-1, rowSelected-1); //cout << "display connections" << endl; rowSelected=-1; colSelected=-1; } else { cout << "invalid new START vertex, please select a new START vertex first." << endl; break; } //-------------------------------------------- action = -1; break; case 16: if(grid_world.isGridMapInitialised()){ grid_world.displayMapConnections(); //cout << "display connections" << endl; //~ rowSelected=-1; //~ colSelected=-1; } else { cout << "map has not been initialised yet." << endl; break; } //-------------------------------------------- action = -1; break; case 6: //set cell as new START vertex { //-------------------------------------------- // retrieve current START vertex vertex s = grid_world.getStartVertex(); if( (s.row != -1) && (s.col != -1) ){ //set current START VERTEX to an ordinary TRAVERSABLE CELL grid_world.setMapTypeValue(s.row, s.col, '0'); grid_world.initialiseMapConnections(); //ok, proceed } else { cout << "invalid START vertex" << endl; break; } //-------------------------------------------- //set selected cell as the NEW START VERTEX if( rowSelected != -1 && colSelected != -1){ grid_world.setMapTypeValue(rowSelected-1, colSelected-1, '6'); s.row = rowSelected-1; s.col = colSelected-1; grid_world.setStartVertex(s); rowSelected=-1; colSelected=-1; } else { cout << "invalid new START vertex, please select a new START vertex first." << endl; break; } //-------------------------------------------- action = -1; break; } case 7: //set cell as new GOAL vertex { //-------------------------------------------- // retrieve current GOAL vertex vertex s = grid_world.getGoalVertex(); if( (s.row != -1) && (s.col != -1) ){ //set current GOAL VERTEX to an ordinary TRAVERSABLE CELL grid_world.setMapTypeValue(s.row, s.col, '0'); //ok, proceed } else { cout << "invalid GOAL vertex" << endl; action = -1; break; } //-------------------------------------------- //set selected cell as the NEW GOAL VERTEX if( rowSelected != -1 && colSelected != -1){ grid_world.setMapTypeValue(rowSelected-1, colSelected-1, '7'); s.row = rowSelected-1; s.col = colSelected-1; grid_world.setGoalVertex(s); grid_world.initialiseMapConnections(); rowSelected=-1; colSelected=-1; } else { cout << "invalid new GOAL vertex, please select a new GOAL vertex first." << endl; action = -1; break; } //-------------------------------------------- action = -1; break; } case 109: copyDisplayMapToMaze(grid_world, lpa_star); cout << "copied display map to algorithm's maze" << endl; action = -1; break; case 110: lpa_star->updateHValues(); copyMazeToDisplayMap(grid_world, lpa_star); cout << "copied algorithm's maze to display map" << endl; action = -1; break; case 9: //display g-values only grid_world.displayMapWithSelectedDetails(true, false, false, false); //(bool display_g, bool display_rhs, bool display_h, bool display_key) action = -1; break; case 10: //display h-values only grid_world.displayMapWithSelectedDetails(false, false, true, false); //(bool display_g, bool display_rhs, bool display_h, bool display_key) action = -1; break; case 11: //display key-values only lpa_star->updateAllKeyValues(); copyMazeToDisplayMap(grid_world, lpa_star); grid_world.displayMapWithSelectedDetails(false, false, false, true); //(bool display_g, bool display_rhs, bool display_h, bool display_key) action = -1; break; case 12: //make cell Traversable if( rowSelected != -1 && colSelected != -1){ grid_world.setMapTypeValue(rowSelected-1, colSelected-1, '0'); rowSelected=-1; colSelected=-1; } action = -1; break; case 14: grid_world.displayMapWithPositionDetails(); action = -1; break; //~ default: //Display grid without details //~ grid_world.displayMap(); }; //---------------------------------------------------------------------------------------------------------------- // Mouse handling // if(mousedown()){ ANIMATE_MOUSE_FLAG=true; mX = mousecurrentx(); mY = mousecurrenty(); //if the goal selected is within the playing field boundaries if(mX >= grid_world.getFieldX1() && mX <= grid_world.getGridMaxX() && mY >= grid_world.getFieldY1() && mY <= grid_world.getGridMaxY()){ circle(mX, mY, 3); validCellSelected = true; } else { validCellSelected = false; } } //end of mousedown() //------------------------------------------------------------------------------------------------------------------ ///////////////////////////////////////////////////////////////////////////// if(ANIMATE_MOUSE_FLAG){ //draw Cross-hair to mark Goal setcolor(RED); circle(mX, mY, 20); line(mX,mY-20,mX,mY+20); line(mX-20,mY,mX+20,mY); //end of draw Cross-hair // special effect to display concentric circles locating the target setcolor(YELLOW); if(mouseRadius < 40) { mouseRadius += 1; } circle(mX, mY, mouseRadius); //Sleep(50); if(mouseRadius >= 40) { ANIMATE_MOUSE_FLAG=false; mouseRadius=0; } //end of special effect } ///////////////////////////////////////////////////////////////////////////// char info[80]; float wX, wY; wX = xWorld(worldBoundary,deviceBoundary,mX); wY = yWorld(worldBoundary,deviceBoundary,mY); sprintf(info,"x: %d, y: %d",mX, mY); drawInformationPanel(grid_world.getFieldX2(), grid_world.getFieldY1() + textheight("H")*2, info); sprintf(info,"wX: %3.0f, wY: %3.0f",wX, wY); drawInformationPanel(grid_world.getFieldX2(),grid_world.getFieldY1() + textheight("H")*5, info); ///////////////////////////////////////////////////////////////////////////// //~ CellPosition p; //~ int rowSelected, colSelected; if(validCellSelected) { p=grid_world.getCellPosition_markCell(mX, mY); rowSelected = p.row; colSelected = p.col; sprintf(info,"row: %d, col: %d",rowSelected, colSelected); drawInformationPanel(grid_world.getFieldX2(),grid_world.getFieldY1() + textheight("H")*6, info); } setvisualpage(page); page = !page; //switch to another page } }