void OLCSprint::AddStartEdges() { assert(num_stages <= MAX_STAGES); assert(num_stages > 0); assert(n_points > 0); const int max_altitude = GetMaximumStartAltitude(TraceManager::GetPoint(n_points - 1)); const ScanTaskPoint start(0, FindStart()); if (GetPoint(start).GetIntegerAltitude() <= max_altitude) LinkStart(start); }
void ContestDijkstra::AddStartEdges() { assert(num_stages <= MAX_STAGES); assert(n_points > 0); const int max_altitude = incremental ? GetMaximumStartAltitude(GetPoint(n_points - 1)) : 0; for (ScanTaskPoint destination(0, 0), end(0, n_points); destination != end; destination.IncrementPointIndex()) { // only add points that are valid for the finish if (!incremental || GetPoint(destination).GetIntegerAltitude() <= max_altitude) LinkStart(destination); } }
bool OLCTriangle::FindClosingPairs(unsigned old_size) { if (predict) { return closing_pairs.Insert(ClosingPair(0, n_points-1)); } struct TracePointNode { const TracePoint *point; unsigned index; }; struct TracePointNodeAccessor { gcc_pure int GetX(const TracePointNode &node) const { return node.point->GetFlatLocation().x; } gcc_pure int GetY(const TracePointNode &node) const { return node.point->GetFlatLocation().y; } }; QuadTree<TracePointNode, TracePointNodeAccessor> search_point_tree; for (unsigned i = old_size; i < n_points; ++i) { TracePointNode node; node.point = &GetPoint(i); node.index = i; search_point_tree.insert(node); } search_point_tree.Optimise(); bool new_pair = false; for (unsigned i = old_size; i < n_points; ++i) { TracePointNode point; point.point = &GetPoint(i); point.index = i; const SearchPoint start = *point.point; const unsigned max_range = trace_master.ProjectRange(start.GetLocation(), max_distance); const unsigned half_max_range_sq = max_range * max_range / 2; const int min_altitude = GetMinimumFinishAltitude(*point.point); const int max_altitude = GetMaximumStartAltitude(*point.point); unsigned last = 0, first = i; const auto visitor = [this, i, start, half_max_range_sq, min_altitude, max_altitude, &first, &last] (const TracePointNode &node) { const auto &dest = *node.point; if (node.index + 2 < i && dest.GetIntegerAltitude() <= max_altitude && IsInRange(start, dest, half_max_range_sq, max_distance)) { // point i is last point first = std::min(node.index, first); last = i; } else if (node.index > i + 2 && dest.GetIntegerAltitude() >= min_altitude && IsInRange(start, dest, half_max_range_sq, max_distance)) { // point i is first point first = i; last = std::max(node.index, last); } }; search_point_tree.VisitWithinRange(point, max_range, visitor); if (last != 0 && closing_pairs.Insert(ClosingPair(first, last))) new_pair = true; } return new_pair; }