Почему цикл бесконечен? - PullRequest
0 голосов
/ 09 мая 2020

Привет, ребята!

Я хочу переключиться на UE4 и сейчас пытаюсь повторить функцию поиска пути по путевым точкам, она хорошо работает в Unity, но были проблемы в C ++. функция получилась с бесконечным l oop, я так понимаю openList не может стать пустым. моих знаний c ++ недостаточно для решения проблемы. Буду рад любой помощи!

TArray<FVector> UWaypointsPathfinding::GetPath(UWaypoint* startNode, UWaypoint* goalNode)
{
    UWaypoint* beginNode = startNode;
    set<UWaypoint*> openList;
    vector<UWaypoint*> closedList;

    openList.insert(startNode);
    startNode->previous = nullptr;
    startNode->distance = 0;


    while (!openList.empty())
    {
        startNode = *openList.begin();
        openList.erase(openList.begin());


        float dist = startNode->distance;
        closedList.push_back(startNode);
        if(startNode == goalNode) break;

        int l = startNode->nearest.Num();
        for (int i = 0; i < l; i++)
        {
            UWaypoint* node = startNode->nearest[i]->FindComponentByClass<UWaypoint>();
            if(find(closedList.begin(),closedList.end(),node) != closedList.end() || openList.find(node) != openList.end())
                continue;

            node->previous = startNode;
            node->distance = dist + FVector::Dist(node->GetOwner()->GetActorLocation(), startNode->GetOwner()->GetActorLocation());
            node->distance += FVector::Dist(node->GetOwner()->GetActorLocation(), goalNode->GetOwner()->GetActorLocation());

            openList.insert(startNode);
        }


    }

    // create path...

    return TArray<FVector>();
}

якобы проблема в этой штуке

if(startNode == goalNode) break;

int l = startNode->nearest.Num();
for (int i = 0; i < l; i++)
{
   UWaypoint* node = startNode->nearest[i]->FindComponentByClass<UWaypoint>();
   if(find(closedList.begin(),closedList.end(),node) != closedList.end() || openList.find(node) != openList.end())
                        continue;

    node->previous = startNode;
    node->distance = dist + FVector::Dist(node->GetOwner()->GetActorLocation(), startNode->GetOwner()->GetActorLocation());
    node->distance += FVector::Dist(node->GetOwner()->GetActorLocation(), goalNode->GetOwner()->GetActorLocation());

    openList.insert(startNode);
}

1 Ответ

0 голосов
/ 15 мая 2020

Лог c странный, так что, вероятно, это опечатка. Вы вставляете startNode в openList в начале, затем стираете его в l oop и вставляете снова. Таким образом, в openList всегда будет один элемент startNode, и все циклы будут идентичными. Возможно, вы имели в виду openList.insert(node); вместо openList.insert(startNode); в последней строке l oop?

...