36 const double x,
const double y) {
37 CHECK_GT(reference_line.size(), 0U);
39 auto func_distance_square = [](
const PathPoint& point,
const double x,
41 double dx = point.
x() - x;
42 double dy = point.
y() - y;
43 return dx * dx + dy * dy;
46 double distance_min = func_distance_square(reference_line.front(), x, y);
47 std::size_t index_min = 0;
49 for (std::size_t i = 1; i < reference_line.size(); ++i) {
50 double distance_temp = func_distance_square(reference_line[i], x, y);
51 if (distance_temp < distance_min) {
52 distance_min = distance_temp;
57 std::size_t index_start = (index_min == 0) ? index_min : index_min - 1;
58 std::size_t index_end =
59 (index_min + 1 == reference_line.size()) ? index_min : index_min + 1;
61 if (index_start == index_end) {
62 return reference_line[index_start];
65 return FindProjectionPoint(reference_line[index_start],
66 reference_line[index_end], x, y);
70 const std::vector<PathPoint>& reference_line,
const double x,
72 auto matched_path_point =
MatchToPath(reference_line, x, y);
73 double rtheta = matched_path_point.theta();
74 double rx = matched_path_point.x();
75 double ry = matched_path_point.y();
76 double delta_x = x - rx;
77 double delta_y = y - ry;
78 double side = std::cos(rtheta) * delta_y - std::sin(rtheta) * delta_x;
79 std::pair<double, double> relative_coordinate;
80 relative_coordinate.first = matched_path_point.s();
81 relative_coordinate.second =
82 std::copysign(std::hypot(delta_x, delta_y), side);
83 return relative_coordinate;
88 auto comp = [](
const PathPoint& point,
const double s) {
93 std::lower_bound(reference_line.begin(), reference_line.end(), s, comp);
94 if (it_lower == reference_line.begin()) {
95 return reference_line.front();
96 }
else if (it_lower == reference_line.end()) {
97 return reference_line.back();