MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); createActions(); createMenus(); initVectors(); initListeners(); muteEvent=false; ClickedClear(); sqlite = new SQLite(); openSet(true); sqlite->startDriver(); }
vector<point> BlockAStar::startProcess() { //////////////////////////////////////////////////////////////////////////// //initialize variables point start(0,0); point goal(gridSize[0]-1,gridSize[1]-1); int nodepointer = 0; int currentIdx; point current(0,0); int neighborIdx; point neighbor(0,0); int i; FLOAT tentativeScore; //helper variables int gridElements = gridSize[0]*gridSize[1]; int allocSize = (int)floor(PREALLOC_FACTOR*gridElements); //G.create(size[0],size[1]); //contains the accumulated values G.create(size[0],size[1],blockSize); //contains the accumulated values nodeMap.create(-1,gridSize[0],gridSize[1]); //matrix that contains the index updated[0] = new Matrix<bool>(false,gridSize[0]+1,gridSize[1]+1); //update flags updated[1] = new Matrix<bool>(false,gridSize[0]+1,gridSize[1]+1); //+1, so that no border check necessary updated[2] = new Matrix<bool>(false,gridSize[0]+1,gridSize[1]+1); nodes.reserve(allocSize); cameFrom.reserve(allocSize); gScore.reserve(allocSize); //fScore.reserve(allocSize); MinHeap<FLOAT> openSet((int)(allocSize/PREALLOC_FACTOR)); //openset - priority queue #ifdef USE_CLOSEDSET Matrix<bool> closedSet(gridSize[0],gridSize[1]); ///closedset - matrix #endif //USE_CLOSEDSET //////////////////////////////////////////////////////////////////////////// //intialize start values nodes.push_back(start); cameFrom.push_back(-1); FLOAT tempGS = getRealCost(start,-1); gScore.push_back(tempGS); nodeMap.set(start,nodepointer); openSet.push(tempGS+getHeuristicCost(start,goal),nodepointer); //////////////////////////////////////////////////////////////////////////// //start iterations while (!openSet.empty()) { //get node with lowest cost currentIdx = openSet.pop(); current = nodes[currentIdx]; //check if we are at goal if (current==goal) { break; } #ifdef USE_CLOSEDSET ///add to closed set closedSet.set(current,1); #endif //USE_CLOSEDSET //evaluate each neighbor for (i=0;i<3;i++) { neighbor = current + move[i]; //border check if ((neighbor.first >= gridSize[0]) || (neighbor.second >= gridSize[1])){ continue; } //check mask if (useMask) { if (mask.get(neighbor)==0) { continue; } } #ifdef USE_CLOSEDSET ///check closed set if (closedSet.get(neighbor) == 1) { continue; //do nothing for this neighbor } #endif //USE_CLOSEDSET neighborIdx = nodeMap.get(neighbor); tentativeScore = getRealCost(neighbor,neighborIdx); if (neighborIdx == -1) //unwalked coordinates - not in the openlist { nodepointer++, neighborIdx = nodepointer; nodeMap.set(neighbor,neighborIdx); nodes.push_back(neighbor); cameFrom.push_back(currentIdx); gScore.push_back(tentativeScore); cout << "\r" << nodepointer+1 << " Blocks of maximal " <<gridElements<< " calculated"; //add to openlist openSet.push(tentativeScore + getHeuristicCost(neighbor, goal),neighborIdx); } else if (tentativeScore < gScore[neighborIdx]) //new value is better than old one { nodes[neighborIdx] = neighbor; cameFrom[neighborIdx] = currentIdx; gScore[neighborIdx] = tentativeScore; //update value in openlist openSet.push(tentativeScore + getHeuristicCost(neighbor, goal),neighborIdx); } } } cout << "\r" << nodepointer+1 << " Blocks of maximal " <<gridElements<< " calculated\n"; LOG_totalBlocks = gridElements; LOG_calcBlocks = nodepointer+1; //////////////////////////////////////////////////////////////////////////// //Backtrack vector<point> path = backtrack(); return path; };