@@ -93,10 +93,20 @@ latlng closest_on_segment(latlng const& x, latlng const& segment_from,
93
93
94
94
auto const start_vec = merc_x - merc_from;
95
95
auto const end_vec = merc_x - merc_to;
96
- auto const start_angle =
97
- std::acos (seg_dir.dot (start_vec) / (seg_len * start_vec.length ()));
98
- auto const end_angle =
99
- std::acos (seg_dir.dot (end_vec) / (seg_len * end_vec.length ()));
96
+
97
+ auto const start_rel =
98
+ seg_dir.dot (start_vec) / (seg_len * start_vec.length ());
99
+ if (start_rel >= 1 - kEpsilon ) {
100
+ return segment_from;
101
+ }
102
+
103
+ auto const end_rel = seg_dir.dot (end_vec) / (seg_len * end_vec.length ());
104
+ if (end_rel >= 1 - kEpsilon ) {
105
+ return segment_to;
106
+ }
107
+
108
+ auto const start_angle = std::acos (start_rel);
109
+ auto const end_angle = std::acos (end_rel);
100
110
101
111
assert (!std::isnan (start_angle) && !std::isnan (end_angle));
102
112
@@ -114,9 +124,8 @@ latlng closest_on_segment(latlng const& x, latlng const& segment_from,
114
124
115
125
// Destination point given distance and bearing from start point
116
126
// http://www.movable-type.co.uk/scripts/latlong.html
117
- latlng destination_point (geo::latlng const & source,
118
- double const distance,
119
- double const bearing) {
127
+ latlng destination_point (geo::latlng const & source, double const distance,
128
+ double const bearing) {
120
129
// convert to rad
121
130
auto const lat_source_rad = to_rad (source.lat_ );
122
131
auto const bearing_rad = to_rad (bearing);
0 commit comments