36 {
37 CHECK_GT(reference_line.size(), 0U);
38
39 auto func_distance_square = [](const PathPoint& point, const double x,
40 const double y) {
41 double dx = point.x() - x;
42 double dy = point.y() - y;
43 return dx * dx + dy * dy;
44 };
45
46 double distance_min = func_distance_square(reference_line.front(), x, y);
47 std::size_t index_min = 0;
48
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;
53 index_min = i;
54 }
55 }
56
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;
60
61 if (index_start == index_end) {
62 return reference_line[index_start];
63 }
64
65 return FindProjectionPoint(reference_line[index_start],
66 reference_line[index_end], x, y);
67}