inline bool OrderedTask::RunDijsktraMin(const GeoPoint &location) { const unsigned task_size = TaskSize(); if (task_size < 2) return false; if (dijkstra_min == nullptr) dijkstra_min = new TaskDijkstraMin(); TaskDijkstraMin &dijkstra = *dijkstra_min; const unsigned active_index = GetActiveIndex(); dijkstra.SetTaskSize(task_size - active_index); for (unsigned i = active_index; i != task_size; ++i) { const SearchPointVector &boundary = task_points[i]->GetSearchPoints(); dijkstra.SetBoundary(i - active_index, boundary); } SearchPoint ac(location, task_projection); if (!dijkstra.DistanceMin(ac)) return false; for (unsigned i = active_index; i != task_size; ++i) SetPointSearchMin(i, dijkstra.GetSolution(i - active_index)); return true; }
fixed OrderedTask::ScanDistanceMin(const GeoPoint &location, bool full) { if (full) { if (dijkstra_min == NULL) dijkstra_min = new TaskDijkstraMin(*this); SearchPoint ac(location, task_projection); if (dijkstra_min->DistanceMin(ac)) { for (unsigned i = GetActiveIndex(), end = TaskSize(); i != end; ++i) SetPointSearchMin(i, dijkstra_min->GetSolution(i)); } last_min_location = location; } return taskpoint_start->ScanDistanceMin(); }
void OrderedTask::set_tp_search_achieved(unsigned tp, const SearchPoint &sol) { if (task_points[tp]->HasSampled()) SetPointSearchMin(tp, sol); }