void setAllInfoAStarNode(aStarNode* f_inputAStarNode_pst, node* f_inputInfoNode_pst, aStarNode* f_inputCameFromNode_pst, int32 f_inputGscore_i32, int32 f_inputHscore_i32) { setInformationPtr(f_inputAStarNode_pst, f_inputInfoNode_pst); setCameFromPtr(f_inputAStarNode_pst, f_inputCameFromNode_pst); setGScore(f_inputAStarNode_pst, f_inputGscore_i32); setHScore(f_inputAStarNode_pst, f_inputHscore_i32); setFScore(f_inputAStarNode_pst, f_inputGscore_i32, f_inputHscore_i32); }
void ComputePath::getPath( Point from,Point to ) { insertInOpenSteps(ShortestPathStep::createFromPos(from)); do { auto currentStep = spOpenSteps.at(0); spClosedSteps.pushBack(currentStep); spOpenSteps.erase(0); if (currentStep->getPos() == to) { constructPath(currentStep); spOpenSteps.clear(); spClosedSteps.clear(); break; } auto points = _layer->getValidStep(currentStep->getPos()); for (int i = 0 ; i < points->count(); i++) { auto v = points->getControlPointAtIndex(i); auto step = ShortestPathStep::createFromPos(v); int closeindex = -1; for (int i = 0 ; i < spClosedSteps.size();i++ ) { if (spClosedSteps.at(i)->isEqual(step)) { closeindex = i; break; } } if (closeindex != -1) { continue; } auto moveCost = this->costToMoveFromStep(currentStep,step); int index = -1; for (int i = 0; i < spOpenSteps.size();i++) { auto item = spOpenSteps.at(i); if (step->isEqual(item)) { index = i; break; } } if (index == -1) { step->setParent(currentStep); step->setGScore(currentStep->getGScore() + moveCost); step->setHScore(this->computeHScoreFromCoord(step->getPos(),to)); this->insertInOpenSteps(step); } else { step = this->spOpenSteps.at(index); if (currentStep->getGScore() + moveCost < step->getGScore()) { step->setGScore(currentStep->getGScore() + moveCost); step->retain(); spOpenSteps.erase(index); this->insertInOpenSteps(step); step->release(); } } } } while (spOpenSteps.size() > 0); }