Skip to content

Commit 94ecc68

Browse files
closest_on_segment: check for infinity before acos
1 parent 7eb4283 commit 94ecc68

File tree

1 file changed

+16
-7
lines changed

1 file changed

+16
-7
lines changed

src/latlng.cc

+16-7
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,20 @@ latlng closest_on_segment(latlng const& x, latlng const& segment_from,
9393

9494
auto const start_vec = merc_x - merc_from;
9595
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);
100110

101111
assert(!std::isnan(start_angle) && !std::isnan(end_angle));
102112

@@ -114,9 +124,8 @@ latlng closest_on_segment(latlng const& x, latlng const& segment_from,
114124

115125
// Destination point given distance and bearing from start point
116126
// 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) {
120129
// convert to rad
121130
auto const lat_source_rad = to_rad(source.lat_);
122131
auto const bearing_rad = to_rad(bearing);

0 commit comments

Comments
 (0)